Οποιαδήποτε λύση για την παράνομη Σταυρό εξαίρεση Θέμα λειτουργίας;

ψήφοι
15

Όταν τα δεδομένα δεσμεύουν σε C #, το νήμα που αλλάζει τα δεδομένα αναγκάζει τον έλεγχο για να αλλάξει πάρα πολύ. Αλλά αν αυτό το νήμα δεν είναι αυτός για τον οποίο δημιουργήθηκε ο έλεγχος, θα πάρετε μια παράνομη Σταυρού Θέμα εξαίρεση λειτουργία.

Είναι ούτως ή άλλως εκεί για να αποφευχθεί αυτό;

Δημοσιεύθηκε 05/08/2008 στις 08:45
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
3

Εάν η τροποποίηση των δεδομένων δεν είναι πολύ χρονοβόρα (δηλαδή, αν ο κύριος σκοπός του νήματος υπόβαθρο δεν είναι η πραγματική μεταβολή των δεδομένων), προσπαθήστε να μετακινήσετε το τμήμα που τροποποιεί τα δεδομένα σε έναν εκπρόσωπο και Invoke'ing ότι η εκπρόσωπος.

Αν η πραγματική βαριά εργασία είναι σχετικά με τα δεδομένα, θα πρέπει πιθανώς να δημιουργήσει μια βαθιά αντίγραφο αυτών των δεδομένων να περάσει στο νήμα φόντο, το οποίο θα στείλει τα επεξεργασμένα δεδομένα πίσω στο νήμα UI μέσω Invoke και πάλι.

Θα πρέπει μόνο να μετακινήσετε τον κωδικό που αλλάζει τα δεδομένα στη λειτουργία εκπρόσωπο (επειδή η αλλαγή των δεδομένων είναι αυτό που πυροδοτεί την ενημέρωση ελέγχου). Εκτός από αυτό, δεν πρέπει να έχετε να γράψετε τίποτα επιπλέον.

Απαντήθηκε 05/08/2008 στις 09:05
πηγή χρήστη

ψήφοι
3

Θα πρέπει να είναι σε θέση να κάνει κάτι σαν:

if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}

InvokeRequired είναι ένα ξενοδοχείο σε Έλεγχοι για να δείτε αν είστε στο σωστό νήμα, τότε Invoke θα επικαλεστεί τον πληρεξούσιο στο σωστό νήμα.

UPDATE: Στην πραγματικότητα, επιτέλους τη δουλειά μου κάναμε κάτι σαν αυτό:

private void SomeEventHandler(Object someParam)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
    }

    // Regular handling code
}

η οποία καταργεί την ανάγκη για το μπλοκ άλλο και το είδος της σφίγγει τον κώδικα.

Απαντήθηκε 05/08/2008 στις 08:51
πηγή χρήστη

ψήφοι
1

Καθώς δεν έχω μια δοκιμή υπόθεσης για να πάει από το να μην μπορώ να εγγυηθώ αυτή τη λύση, αλλά μου φαίνεται ότι ένα σενάριο παρόμοιο με εκείνο που χρησιμοποιήθηκε για την ενημέρωση γραμμές προόδου σε διάφορα θέματα (χρησιμοποιήστε ένα πληρεξούσιο) θα ήταν κατάλληλο εδώ.

public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);

public void DoDataBind()
{
    DataBind();
}

Εάν οι ανάγκες δεσμευτική δεδομένα που πρέπει να γίνει από ένα συγκεκριμένο νήμα, τότε ας αυτό το νήμα κάνει τη δουλειά!

Απαντήθηκε 05/08/2008 στις 08:56
πηγή χρήστη

ψήφοι
0

Σε WPF και Silverlight η υποδομή δεσμευτικό φροντίζει το μεταγωγής στο νήμα UI.

Απαντήθηκε 08/08/2008 στις 17:19
πηγή χρήστη

ψήφοι
0

Εάν η κλήση νήμα είναι «παράνομη» (δηλαδή η κλήση DataBind επηρεάζει τους ελέγχους που δεν έχουν δημιουργηθεί στο νήμα που καλείται από), τότε θα πρέπει να δημιουργήσετε έναν πληρεξούσιο, έτσι ώστε ακόμη και αν η απόφαση / προετοιμασία για την DataBind δεν γίνεται το νήμα ελέγχου-δημιουργία, οποιαδήποτε προκύπτουσα μεταβολή από αυτούς (δηλαδή DataBind ()) θα είναι.

Θα καλέσετε τον κωδικό μου από το νήμα των εργαζομένων, όπως αυτό:

this.BindData.Invoke();

Στη συνέχεια, αυτό θα μπορούσε να προκαλέσει το αρχικό νήμα για να κάνει την σύνδεση, η οποία (με την προϋπόθεση ότι είναι το νήμα που δημιούργησε τους ελέγχους) θα πρέπει να εργαστεί.

Απαντήθηκε 05/08/2008 στις 09:06
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more