2011-09-29 69 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