2015-05-28 27 views
1

我認爲我可以叫如何在dispatcher.begininvoke上正確調用回調?

var dispatcherOp = Application.Current.Dispatcher.BeginInvoke(Action()); 
dispatcherOp.Completed += dispatcherOp_Completed; 

但當時我有點擔心。如果begininvoke是異步的,那麼在我得到返回的調度程序操作並附加到完成的事件之前,什麼阻止調度程序完成操作。

我認爲這一定是不可能的,但如果是這樣,我想知道爲什麼。

回答

1

答案是:什麼都沒有。

有三種可能的方法:

1)你可以決定,這不是重要的是等待操作執行。如果是這樣,那麼你正在選擇fire and forget策略。

2.)你可以決定你想要一個同步請求,所以你等待,就像建議的SLaks一樣。

3.)您可以保持請求異步,但使用callback

3

你是對的;這是不安全的。您應該只需await的操作。

+0

不知道我明白你的意思。你能給我一個如何使用它的例子嗎? –

+0

https://msdn.microsoft.com/en-us/library/hh191443 – SLaks

0

不幸的是Dispatcher沒有一個回調函數需要begininvoke。

同步操作是不是在我的程序需要,但我意識到以後谷歌搜索或兩個,我可以將其鎖定這樣

lock (this) 
      { 
       var dispatcherOp = Application.Current.Dispatcher.BeginInvoke(MyAction, DispatcherPriority.Normal); 
       dispatcherOp.Completed += dispatcherOp_Completed; 
      } 



void dispatcherOp_Completed(object sender, EventArgs e) 
     { 
      lock (this) 
      { 

      } 

     } 

,然後再對同一對象在完成功能鎖定,從而調度員在完成附加處理程序之前無法完成。

0

從來沒有理由在現代應用中使用Dispatcher.BeginInvoke

如果您的代碼模擬後臺操作,請使用async/awaitIProgress<T>以獲取任何進度更新。

如果您的代碼建立異步序列模型,則使用Rx(Reactive Extensions)與ObserveOn以使用UI線程關聯更新對象。

+0

有沒有一種方法可以使用異步等待來調用GUI線程上的東西? –

+0

我總是發現反轉這種邏輯更好:GUI線程驅動應用程序中的所有內容。什麼都沒有調用GUI線程。後臺操作可以​​報告結果(GUI線程用'await'檢索),更新('IProgress ')或事件(Rx),但它們從未實際直接調用GUI線程。 –

+0

確定閱讀一些例子,我想我更瞭解它。現在閱讀關於被動擴展。從來沒有聽說過它 –

相關問題