2010-11-30 4 views
2

Können sagen, ich habe ein Formular mit 2 textboxsMultithreading Windows-Anwendung

im in einem anderen Thread, und ich will Texte in diesen beiden textboxs compine ich verstehe, dass ich jeden einzelnen von ihnen berufen kann, und den Wert erhalten dann verketten sie aber

ich dachte an eine Möglichkeit, 2 Steuerelemente auf einmal aufzurufen, ohne den Hauptfaden zu hängen.

, habe ich versucht, Textfelder nacheinander aufgerufen werden dann Wert erhalten, aber, dass mein Haupt-Thread aus irgendwelchen Gründen gehängt

eine Vorstellung davon, wie das zu tun, ohne den roten Faden zu hängen?

Probe:

txtFrom.Invoke(new MethodInvoker(() => strFrom = txtFrom.Text)); 
     txtTo.Invoke(new MethodInvoker(() => strTo = txtTo.Text)); 
     txtMessageBody.Invoke(new MethodInvoker(() => strMessageBody = txtMessageBody.Text)); 
     txtStartDate.Invoke(new MethodInvoker(() => strStartDate = txtStartDate.Text)); 
     txtEndDate.Invoke(new MethodInvoker(() => strEndDate = txtEndDate.Text)); 
     ddlStatus.Invoke(new MethodInvoker(() => intStatus = ddlStatus.SelectedIndex)); 

Dank im Voraus

enviroments:

Windows 7. .Net 4 Windows Form C#

Antwort

1

Da Sie sagen, 2 Steuerelemente auf einmal aufrufen, ohne den Hauptthread hängen, ich vermute, dass es hier einige Verwirrung gibt.

Wenn Sie Invoke ein Steuerelement in WinForms wie Sie beschreiben, wird Code innerhalb dieser MethodInvokes tatsächlich auf dem UI/Haupt-Thread ausgeführt. Dies bedeutet, dass beim Aufruf dieser Steuerelemente Code auf dem UI-Thread ausgeführt wird, sodass auf die Steuerelemente in dem Thread zugegriffen werden kann, aus dem sie ursprünglich erstellt wurden. Daher wird jede längere Operation in diesem Code den UI-Thread hängen.

Die langwierige Operation sollte daher auf einem separaten Thread gestartet werden, vielleicht unter Verwendung der BackgroundWorker.

+0

ich denke, das ist es, ich werde versuchen und den Code neu zu gestalten, um die langwierige Operation auf einem Diff-Thread dann werde ich zurück und lassen Sie es wissen – Stacker

2

Da sie in der gleichen Form leben, Sie gehören alle demselben GUI-Thread. Dies bedeutet, dass Sie einen von ihnen (oder ihrer Mutterform) als invoke Ziel und tun alle Vorgänge innerhalb eines invoke verwenden können:

this.Invoke(new MethodInvoker(() => 
{ 
    strFrom = txtFrom.Text; 
    strTo = txtTo.Text; 
    strMessageBody = txtMessageBody.Text; 
    strStartDate = txtStartDate.Text; 
    strEndDate = txtEndDate.Text; 
    intStatus = ddlStatus.SelectedIndex; 
})); 

Ich bin nicht sicher, ob dies Ihr Problem löst, aber es zumindest vereinfacht Ihre Code.

+0

Ich habe das versucht, aber es hängt die GUI – Stacker

+0

@Stacker: Sind Sie sicher, dass es innerhalb dieses Codes hängt? –

+0

Das ist der folgende Code des vorherigen: gvResults.Invoke (new MethodInvoker (delegate() {// someCode Mit Text Ergebnis suchen})); Aber wie Sie sehen können, im im Aufruf der Grid, also warum die Gui hängen würde ich donno – Stacker

3

Können Sie stattdessen BeginInvoke verwenden? Ich vermeide immer Invoke, weil es eine Angewohnheit hat, Deadlocks zu verursachen, die die Anwendung hängen ...

Der Grund dafür ist, dass Invoke Ihren Worker Thread setzt und warten, bis der UI-Thread verfügbar ist. Das kann ein Problem sein, da die Wahrscheinlichkeit groß ist, dass Ihr UI-Thread auf Ihren Worker-Thread gewartet hat. (Zum Beispiel kann Ihr Worker-Thread im Besitz von Locks sein, möglicherweise von denen Sie gar nichts wissen, weil sie sich in einer Bibliothekskomponente befinden. Implicit acquisition of locks or other unshareable resources can cause deadlocks even in single-thread code Also ist es am besten, vorsichtig zu sein. Es ist fast immer eine schreckliche Idee, einen Arbeiter zu machen Thread warten auf den UIhread, um etwas zu tun.)

Wie Peter Lillevold darauf hinweist, müssen Sie schließlich sicherstellen, dass Sie nichts langsam auf dem UI-Thread tun.Aber es ist nicht klar aus Ihrem Beispielcode, was passiert - ich sehe nichts in Ihrem Code, das langsam sein wird, und von Ihrer Beschreibung, es klang wie die Anwendung hängt vollständig, in diesem Fall ist es wahrscheinlicher, dass Sie ' habe einen Invoke-induzierten Deadlock.