2016-04-15 31 views
0

工作爲什麼這個工作:調度不是在非同步模式

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

但這不起作用?

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

一步一步地調試正確進入第一種方法,但不會進入第二種方法。 在調用InvokeAsynch方法之前是否需要調整?

上下文是WPF應用程序。

回答

0

因爲it's你要等到它的異步方法返回:

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

或者使用下面的語法,如果你不是在一個「異步語境」:

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

它似乎沒有辦法。 如果我運行: await Application.Current.Dispatcher.InvokeAsync(()=> Mymethod()); MyMethod代碼永遠不會運行,線程將無限期地等待。 –

+0

我認爲你必須添加你的方法作爲引用,而不是像這樣調用它:'await Application.Current.Dispatcher.InvokeAsync((=> Mymethod);' – Hypnobrew

0

結果Dispatcher.InvokeAsync(...)DispatcherOperation。這幾乎是提交給Dispatcher隊列的任務的包裝器。 所以讓我相信你期待,你可以使用下面的代碼的行爲:

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

,或者你可以await這個對象,因爲它有TaskAwaiter GetAwaiter()方法。