Noen løsning på ulovlig Cross tråden Operation unntak?

stemmer
16

Når du data binde i C #, tråden som endrer data fører til at kontrollen for å endre også. Men hvis denne tråden er ikke den som kontrollen ble opprettet, vil du få en ulovlig Cross Tråd Operation unntak.

Er det allikevel å hindre dette?

Publisert på 05/08/2008 klokken 07:45
kilden bruker
På andre språk...                            


5 svar

stemmer
3

Hvis dataene modifikasjon er ikke altfor tidkrevende (det vil si, hvis hovedformålet med den bakgrunn tråd er ikke de faktiske data modifikasjon), prøve å flytte delen som modifiserer data til en representant og Invoke'ing det delegere.

Dersom den faktiske tungt arbeid er på data, vil du sannsynligvis nødt til å opprette en dyp kopi av disse dataene til å passere til bakgrunnstråd, som vil sende data behandles tilbake til UI tråden via Invoke igjen.

Du vil bare nødt til å flytte koden som endrer data i delegat funksjon (fordi dataene endringen er hva som utløser kontroll oppdatering). Annet enn det, bør du ikke å skrive noe ekstra.

Svarte 05/08/2008 kl. 08:05
kilden bruker

stemmer
3

Du bør være i stand til å gjøre noe sånt som:

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

InvokeRequired er en eiendom på kontroller for å se om du er på riktig tråd, så Invoke vil påberope seg delegat på riktig tråd.

OPPDATERING: Egentlig, på min siste jobb vi gjorde noe sånt som dette:

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

    // Regular handling code
}

som fjerner behovet for andre kvartal og type strammer opp koden.

Svarte 05/08/2008 kl. 07:51
kilden bruker

stemmer
1

Som jeg ikke har en test for å gå fra jeg ikke kan garantere denne løsningen, men det virker for meg som et scenario som ligner på den som brukes til å oppdatere fremdriftsindikatorer i forskjellige tråder (bruk en delegat) ville være egnet her.

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

public void DoDataBind()
{
    DataBind();
}

Hvis databinding må gjøres av en bestemt tråd, så la den tråden gjøre jobben!

Svarte 05/08/2008 kl. 07:56
kilden bruker

stemmer
0

I WPF og Silver bindingen infrastrukturen tar seg av koblings til brukergrensesnittet tråden.

Svarte 08/08/2008 kl. 16:19
kilden bruker

stemmer
0

Hvis tråden samtalen er "ulovlig" (dvs. den DataBind samtale påvirker kontroller som ikke ble opprettet i tråden den blir kalt fra) så må du opprette en delegat slik at selv om avgjørelsen / forberedelse til DataBind ikke er gjort i styreskapende tråd, en hvilken som helst resulterende modifikasjon av dem (dvs. DataBind ()) vil være.

Du vil kalle min kode fra arbeideren tråden slik:

this.BindData.Invoke();

Dette vil da føre til at den opprinnelige tråden å gjøre binding, som (forutsatt det er tråden som opprettet kontrollene) skal fungere.

Svarte 05/08/2008 kl. 08:06
kilden bruker

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