2011-09-29 66 views
2

我在我的公司,他們在許多places.If使用Dispatcher.Invoke()的一個項目,我使用BeginInvoke改爲調用的則線程之間的Synchronisation工作正常,但萬一調用應用程序凍結,甚至不會將執行權限輸入到委託方法中。有人知道爲什麼會發生這種情況嗎?Dispatcher.Invoke()不工作的應用程序

任何答案將不勝感激。在項目用於Invoke

示例代碼:

Dispatcher.Invoke(DispatcherPriority.Send, 
        new DelegateMethod(MethodtoExecute)); 

private delegate void DelegateMethod(); 

void MethodtoExecute() 
     { 
      try 
      { 

      } 
      catch (Exception /*ex*/) 
      { 

      } 
      finally 
      { 

      } 
     } 
+1

你試過這個解決方案: http://stackoverflow.com/questions/ 264163/wpf-dispatcher-invoke-hanging – mikus

+0

不,我沒有嘗試這個解決方案,讓我看看它,任何方式感謝鏈接:) – SharpUrBrain

+0

我們需要更多的信息:你如何得到'調度員'?當主線程凍結時,代碼是什麼? – svick

回答

2

Dispatcher.Invoke同步執行同一個線程應用程序,所以你調用什麼能夠阻止主應用程序線程。 Dispatcher.BeginInvoke是異步執行的,所以它不會在執行時綁定主應用程序線程。

由於您使用的是調度優先級最高的DispatcherPriority.Send,因此您調用的任何操作都會在其他任何操作之前運行,包括渲染屏幕或偵聽事件。我建議將其切換爲DispatcherPriority.Background,其運行優先級低於渲染和輸入。見this pageDispatcherPriority級別的列表和它們的執行順序

我強烈建議你看看答案貼here

+2

傳遞給「Dispatcher.Invoke」或「Dispatcher.BeginInvoke」的委託在主線程上執行。區別在於'BeginInvoke'不會阻塞*調用它的線程*。 – svick

+0

@svick謝謝,更新我的回答 – Rachel

+0

@svick Dispatcher.Invoke和Dispatcher.BeginInvoke都在主線程上執行嗎? BeginInvoke如何不阻塞線程? – Syed