Elke oplossing voor Illegale Cross Thread Operatie uitzondering?

stemmen
15

Wanneer u gegevens in C # te binden, de draad die de data zorgt ervoor dat de controle om te veranderen. Maar als deze draad is niet degene waarop de controle werd gemaakt, moet u een ongeldige Cross Thread Operatie uitzondering te krijgen.

Is er een manier om dit te voorkomen?

De vraag is gesteld op 05/08/2008 om 08:45
bron van user
In andere talen...                            


5 antwoorden

stemmen
3

Indien de data modificatie niet te tijdrovend (betekenis wanneer het hoofddoel van de achtergrondthread niet de feitelijke gegevens modificatie), verplaatst de sectie die de gegevens wijzigt een gedelegeerde Invoke'ing dat delegeren.

Als de werkelijke zware werk is van de gegevens, zult u waarschijnlijk een diepe kopie van deze gegevens te maken om door te geven aan de achtergrond draad, die zal de verwerkte gegevens terug via Roep terug te sturen naar de UI thread.

Je hoeft alleen maar te bewegen de code die de data verandert in de gedelegeerde functie (omdat de gegevens verandering is wat leidt tot de controle update). Anders dan dat, moet je niet hoeft niets extra's te schrijven.

antwoordde op 05/08/2008 om 09:05
bron van user

stemmen
3

Je moet in staat zijn om iets te doen, zoals:

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

InvokeRequired is een woning op Controls om te zien als je op de juiste draad, roept dan zal de afgevaardigde beroepen op de juiste draad.

UPDATE: Eigenlijk, bij mijn laatste baan hebben we zoiets als dit:

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

    // Regular handling code
}

die neemt de noodzaak voor de else blok en de aard van scherpt de code.

antwoordde op 05/08/2008 om 08:51
bron van user

stemmen
1

Aangezien ik niet een testcase om te gaan van I deze oplossing niet kan garanderen, maar het lijkt mij dat een scenario vergelijkbaar met degene gebruikt om de voortgang bars in verschillende threads te werken (gebruik een afgevaardigde) zou hier geschikt zijn.

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

public void DoDataBind()
{
    DataBind();
}

Als de gegevens binding moet worden gedaan door een bepaalde thread, dan laat dat de draad het werk doen!

antwoordde op 05/08/2008 om 08:56
bron van user

stemmen
0

WPF en Silverlight neemt de binding infrastructuur verzorgt het opschakelen naar de UI thread.

antwoordde op 08/08/2008 om 17:19
bron van user

stemmen
0

Als de draad oproep is "illegaal" (dwz de DataBind oproep beïnvloedt controles die niet werden gemaakt in de thread het wordt aangeroepen vanuit), dan moet je een afgevaardigde te creëren, zodat zelfs als de beslissing / voorbereiding op de DataBind is in nog niet klaar de controle creëren schroefdraad daaruit voortvloeiende wijziging ervan (bijv DataBind ()) zal zijn.

Je zou mijn code te bellen vanuit de werknemer draad als volgt:

this.BindData.Invoke();

Dit zou leiden tot de oorspronkelijke draad naar binding, waarbij (veronderstellend is de draad die de controles gemaakt) moet werken.

antwoordde op 05/08/2008 om 09:06
bron van user

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