Vă mulțumim pentru susținere

Orice soluție pentru excepția de funcționare a filetului ilegal?

Atunci când datele se leagă în C #, firul care modifică datele determină modificarea comenzii. Dar dacă acest fir nu este cel pe care a fost creat controlul, veți obține o excepție de operare a unui fir ilicit cu cruce.

Există oricum pentru a preveni acest lucru?

0
adăugat editat

5 răspunsuri

Ar trebui să puteți să faceți ceva de genul:

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

InvokeRequired este o proprietate pe Controls pentru a vedea dacă sunteți pe firul corect, apoi Invoke va invoca delegatul pe firul corect.

UPDATE: De fapt, la ultima mea slujbă am făcut ceva de genul:

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

    // Regular handling code
}

care elimină nevoia de alt bloc și de tipul de strângere a codului.

0
adăugat

Deoarece nu am un test pentru a trece de la Nu pot garanta această soluție, dar mi se pare că un scenariu similar celui folosit pentru a actualiza barele de progres în diferite fire (folosiți un delegat) ar fi potrivit aici.

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

public void DoDataBind()
{
    DataBind();
}

În cazul în care legarea datelor trebuie făcută printr-un fir special, atunci lăsați firul să lucreze!

0
adăugat

Dacă apelul de fir este "ilegal" (de exemplu, apelul DataBind afectează comenzile care nu au fost create în firul de la care este apelat), atunci trebuie să creați un delegat astfel încât, chiar dacă decizia / pregătirea pentru DataBind nu se face în firul care creează controlul, orice modificare rezultantă a acestora (adică DataBind ()).

Mi-ați chema codul din firul lucrătorului așa cum este acesta:

this.BindData.Invoke();

Acest lucru ar face ca firul original să facă legătura, care (presupunând că este firul care a creat comenzile) ar trebui să funcționeze.

0
adăugat

Dacă modificarea datelor nu este prea consumatoare de timp (adică, dacă scopul principal al thread-ului de fond nu este modificarea efectivă a datelor), încercați să mutați secțiunea care modifică datele către un delegat și Invocând acel delegat.

Dacă lucrarea greu actuală se află pe date, probabil că va trebui să creați o copie profundă a acestor date pentru a trece la firul de fundal, care va trimite din nou datele prelucrate către firul UI prin Invocare.

Va trebui să mutați codul care modifică datele în funcția de delegat (deoarece schimbarea datelor este ceea ce declanșează actualizarea de control). În afară de asta, nu ar trebui să scrie nimic în plus.

0
adăugat

În WPF și Silverlight infrastructura de legare are grijă de trecerea la firul UI.

0
adăugat