Dispatcher.Invoke() 不适用于该应用程序

Sha*_*ain 5 c# wpf multithreading delegates dispatcher

我正在开发我公司的一个项目,他们Dispatcher.Invoke()在很多地方使用。如果我使用BeginInvokeInvoke 而不是 Invoke,那么Synchronisation线程之间工作正常,但在 Invoke 的情况下,应用程序会冻结,甚至不进入委托方法的执行。有谁知道为什么会这样?

任何答案将不胜感激。

Invoke项目中使用的示例代码:

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

private delegate void DelegateMethod();

 void MethodtoExecute()
        {
            try
            {

            }
            catch (Exception /*ex*/)
            {

            }
            finally
            {

            }
        }
Run Code Online (Sandbox Code Playgroud)

Rac*_*hel 4

Dispatcher.Invoke与您的应用程序在同一线程上同步执行,因此您调用的任何内容都能够阻塞主应用程序线程。Dispatcher.BeginInvoke异步执行,因此在执行时不会占用主应用程序线程。

由于您使用的DispatcherPriority.Send是最高调度程序优先级,因此您调用的任何内容都会先于其他内容运行,包括渲染屏幕或侦听事件。我建议将其切换为DispatcherPriority.Background,它的运行优先级低于渲染和输入。请参阅此页面以获取级别列表DispatcherPriority及其执行顺序

我强烈建议您查看此处发布的答案

  • 传递给“Dispatcher.Invoke”或“Dispatcher.BeginInvoke”的委托在主线程上执行。不同之处在于“BeginInvoke”不会阻塞*调用它的线程*。 (2认同)
  • @Syed,“BeginInvoke”所做的只是安排代码在主线程上执行,然后立即返回。所以它不会阻塞调用它的线程。但是,如果委托中有一些长计算或任何阻塞,那么它就会阻塞主线程。 (2认同)