Jede Lösung Illegal Querfadenbetrieb Ausnahme?

stimmen
15

Wenn Sie Daten in C # zu binden, dass der Thread die Datenänderungen bewirkt, dass die Steuerung zu ändern. Aber wenn dieser Faden, an dem nicht derjenige ist das Steuerelement erstellt wurde, erhalten Sie eine Illegal Querfadenbetrieb Exception.

Gibt es trotzdem, dies zu verhindern?

Veröffentlicht am 05/08/2008 um 08:45
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
3

Wenn die Datenänderung nicht zu zeitaufwendig (dh, wenn der Hauptzweck des Hintergrund-Thread nicht die tatsächliche Datenänderung ist), versuchen Sie den Abschnitt bewegt, der die Daten an einen Delegierten modifiziert und Invoke'ing diesen Delegaten.

Wenn die tatsächliche schwere Arbeit an den Daten ist, haben Sie wahrscheinlich eine tiefe Kopie dieser Daten zu erstellen, um den Hintergrund-Thread zu übergeben, die die verarbeiteten Daten zurück an den UI-Thread über Invoke wieder senden.

Sie müssen nur bewegen Sie den Code, der die Daten in die Delegatfunktion ändert (da die Datenänderung ist es, was die Steuer Update auslöst). Other than that, sollten Sie müssen nicht nichts extra schreiben.

Beantwortet am 05/08/2008 um 09:05
quelle vom benutzer

stimmen
3

Sie sollten in der Lage sein, etwas zu tun:

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

InvokeRequired ist eine Eigenschaft auf Kontrollen, um zu sehen, ob Sie auf dem richtigen Thread sind, dann rufen Sie den Delegierten auf dem richtigen Thread aufrufen wird.

UPDATE: Eigentlich bei meinem letzten Job haben wir etwas wie folgt aus:

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

    // Regular handling code
}

die beseitigt die Notwendigkeit für den anderen Block und Art strafft den Codes auf.

Beantwortet am 05/08/2008 um 08:51
quelle vom benutzer

stimmen
1

Da ich keinen Testfall muss gehen aus ich diese Lösung nicht garantieren kann, aber es scheint mir, dass ein Szenario ähnlich den Fortschrittsbalken in verschiedenen Threads zu aktualisieren verwendet (einen Delegaten verwenden) hier geeignet wäre.

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

public void DoDataBind()
{
    DataBind();
}

Wenn der Datenbedarf Bindung von einem bestimmten Thread ausgeführt werden, lassen Sie dann das Thread die Arbeit machen!

Beantwortet am 05/08/2008 um 08:56
quelle vom benutzer

stimmen
0

In WPF und Silver die Bindung Infrastruktur übernimmt das Umschalten auf den UI-Thread.

Beantwortet am 08/08/2008 um 17:19
quelle vom benutzer

stimmen
0

Wenn der Thread Aufruf ist „illegal“ (dh die DataBind Anrufsteuerung beeinflusst, die nicht im Thread erstellt wurden sie aus aufgerufen wird), dann müssen Sie einen Delegierten schaffen, so dass selbst wenn die Entscheidung / Vorbereitung auf die DataBind nicht erfolgt die Steuerschöpf Gewinde, jede sich ergebende Änderung von ihnen (dh DataBind ()) sein wird.

Sie würden meinen Code aus dem Arbeiter-Thread wie so nennen:

this.BindData.Invoke();

Dies würde dann dazu führen, der ursprüngliche Thread die Bindung zu tun, die (es vorausgesetzt ist der Thread, der die Kontrollen erstellt) arbeiten sollte.

Beantwortet am 05/08/2008 um 09:06
quelle vom benutzer

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