Orice soluție ilegală Cross excepție Operațiunea fir?

voturi
15

Când datele se leagă în C #, firul care se schimbă datele determină controlul să se schimbe. Dar dacă acest thread nu este cel pe care a fost creat controlul, veți obține o cruce fir excepție Operațiunea ilegală.

Oricum este acolo pentru a preveni acest lucru?

Întrebat 05/08/2008 la 08:45
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
3

În cazul în care modificarea de date nu este prea consumatoare (adică, în cazul în care scopul principal al firului de fond nu este modificarea reală a datelor) de timp, încercați să mutați secțiunea care modifică datele unui delegat și Invoke'ing ca delegat.

În cazul în care munca grea real este pe datele, va trebui, probabil, pentru a crea o copie profundă a acestor date pentru a trece la firul de fond, care va trimite datele prelucrate înapoi la firul UI prin Invocare din nou.

Va trebui doar să se mute codul care se schimbă datele în funcția de delegat (pentru că schimbarea de date este ceea ce declanșează actualizarea de control). Altele decât că, nu ar trebui să scrie nimic în plus.

Publicat 05/08/2008 la 09:05
sursa de către utilizator

voturi
3

Ar trebui să fie capabil să facă ceva de genul:

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

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

UPDATE: De fapt, la ultimul meu loc de muncă 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ă necesitatea de bloc altcineva și un fel de înăsprește codul.

Publicat 05/08/2008 la 08:51
sursa de către utilizator

voturi
1

Așa cum nu am un caz test pentru a merge de la nu pot garanta această soluție, dar mi se pare că un scenariu similar cu cel utilizat pentru a actualiza bare de progres în fire diferite (utilizaț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 are nevoie de legare a datelor care urmează să fie efectuată de către un anumit fir, apoi se lasa ca firul face munca!

Publicat 05/08/2008 la 08:56
sursa de către utilizator

voturi
0

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

Publicat 08/08/2008 la 17:19
sursa de către utilizator

voturi
0

Dacă apelul firului este „ilegală“ (adică apelul DataBind afectează controalele care nu au fost create în firul acesta este chemat de la), atunci aveți nevoie pentru a crea un delegat, astfel încât, chiar dacă decizia / pregătirea pentru DataBind nu se face în firul de creare de control, orice modificare rezultantă a acestora (de exemplu, DataBind ()) va fi.

Te-ar suna codul meu de la firul de muncitor astfel:

this.BindData.Invoke();

Acest lucru ar duce apoi firul original, pentru a face legarea, care (presupunand este firul care a creat controalele) ar trebui să funcționeze.

Publicat 05/08/2008 la 09:06
sursa de către utilizator

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