2016-04-15 3 views
0

Warum funktioniert das:Dispatcher arbeiten nicht in asynch Modus

Application.Current.Dispatcher.Invoke(() => Thread.Sleep(500)); 

aber das funktioniert nicht?

Application.Current.Dispatcher.InvokeAsynch(() => Thread.Sleep(500)); 

Ein Debuggen Schritt für Schritt gibt die erste Methode korrekt wie erwartet ein, gibt aber die zweite Methode nicht ein. Wird vor dem Aufruf der Methode InvokeAsynch eine Aktion benötigt?

Kontext ist eine WPF Anwendung.

Antwort

0

Da Es ist ein asynchrones Verfahren Sie es erwarten müssen zurückzukehren:

await Application.Current.Dispatcher.InvokeAsync(() => Mymethod); 

Oder die Syntax verwenden, unten, wenn Sie nicht in einem „Asynchron-Kontext“ sind:

Application.Current.Dispatcher.InvokeAsync(() => Mymethod).ContinueWith(x => { DoSomething_here }); 
+0

Es scheint nicht den Trick zu tun. Wenn ich rufe: warten Application.Current.Dispatcher.InvokeAsync (() => Mymethod()); MyMethod Code wird nie ausgeführt und der Thread wartet unbegrenzt. –

+0

Ich denke, Sie müssen Ihre Methode als eine Referenz hinzufügen, nicht wie folgt aufrufen: 'apply Application.Current.Dispatcher.InvokeAsync (() => Mymethode);' – Hypnobrew

0

Ergebnis von Dispatcher.InvokeAsync(...) ist ein DispatcherOperation. Es ist ein Wrapper um einen Task, der an die Dispatcher-Warteschlange übergeben wurde. Also, das Verhalten zu bekommen Ich glaube, Sie erwarten Sie den folgenden Code verwenden:

var dispatcherOperation = Application.Current.Dispatcher.InvokeAsync(() => Thread.Sleep(500)); 
dispatcherOperation.Wait(); 

oder Sie können await dieses Objekt als es TaskAwaiter GetAwaiter() Methode hat.