2009-05-22 7 views
3

guten Abend!Wie man lange laufenden "Thread" in WPF behandelt?

Derzeit entwickle ich einen WPF-Client für einige Rest-Service. Die Kommunikation mit dem Rest-Service ist kein Problem und erfolgt in einer extra Assembly (Kommunikationsschnittstelle).

grundsätzlich:
Ich habe eine irgendwie "Suche" -Taste, die eine Methode ausführt. Diese Methode kommuniziert mit dem Dienst, aktualisiert einige Textfelder und eine Fortschrittsanzeige (um dem Benutzer grafische Informationen zu geben, wie weit wir sind ...). Leider ist der Server, der den Dienst hostet, ein wenig lahm, was zu einigen schweren Antwortzeiten (ca. 4 Sekunden) führt. dies, auf der anderen Seite verursacht meine wpf-Anwendung, zu warten, das endet:, geht Schwarz und titeling „reagiert nicht“ ...

ich schon versucht, diese Ausführung in einem anderen Thread zu setzen, aber ... logischerweise bekomme ich keinen zugriff auf die steuerung meines wpf-fensters ...

atm ich bin wirklich hilflos ... kann mir jemand handling-routine oder eine lösung geben?

Antwort

5

This video zeigt, wie eine asynchrone Statusbalken mit WPF schaffen und die Dispatcher.BeginInvoke Methode. Es ist eine nette, sanfte Einführung in eine einfache Lösung für grundlegende Threading-Probleme in WPF.

+0

die dispatcher-variante ist die schönste ... danke sooo viel! –

+1

http://windowsclient.net/learn/video.aspx?v=57027 verweist auf https://www.microsoft.com/net. Fehle ich etwas? – VivekDev

+0

Würde ich gerne dieses Video sehen, wenn jemand einen aktualisierten Link hat? – HischT

5

Ihr UI-Thread wartet auf eine Antwort vom Webdienst und ist nicht zum Zeichnen des Bildschirms verfügbar. Eine gute Option besteht darin, die Dienstanfrage an einen anderen Nicht-UI-Thread zu senden. Schauen Sie sich BackgroundWorker an, das speziell dafür entwickelt wurde, dies zu vereinfachen. Es behandelt das Marshalling von Thread-übergreifenden Aufrufen von Nicht-UI zu UI-Threads.

Grob:

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
bw.RunWorkerAsync(arg); 
... 

static void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = (BackgroundWorker)sender; 
    int arg = (int)e.Argument; 
    e.Result = CallWebService(arg, e); 
} 

static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar.Increment(); 
} 

static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    label.Text = "Done: " + e.Result.ToString(); 
} 
+0

Dies ist im Grunde, was ich versuchte, aber ich bekomme "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, weil ein anderer Thread es besitzt." –

+1

Code? Stellen Sie außerdem sicher, dass Sie Ihre Benutzeroberfläche nicht über den doWork-Ereignishandler berühren. –

+0

... oder irgendetwas, das von ihm aufgerufen wird (wird auf demselben Nicht-UI-Thread ausgeführt). –

1

Um die Kontrollen von einem zweiten Thread Verwendung Dispatcher.BeginInvoke Zugang:

Dispatcher.BeginInvoke(new Action(() => 
    { 
     // Update your controls here. 
    }), null); 

Oder Sie können in mit BackgroundWorker aussehen.

Verwandte Themen