BeginInvoke不在WPF应用程序中的Thread内部触发

时间:2012-06-24 14:37:14

标签: c# .net wpf

我在WPF应用程序中有这个简单的代码:

ThreadStart start = delegate()
{
    Thread.Sleep(5000);
    Console.WriteLine("HEY!");

    Dispatcher.CurrentDispatcher.BeginInvoke(
        DispatcherPriority.Normal,
        new Action(
            delegate()
            {
                Console.WriteLine("Inside invoke?!");
            }
        )
    );
};

new Thread(start).Start();

HEY!会在应用之后立即打印,并且应用程序被阻止,因为人们会期望使用线程,但是,为什么我从未看到{{1} }?我还尝试了不同的优先级,如Inside invoke?!,我认为这是最优先考虑的事项。

我也试过在内部放置断点,它从未停在那里。

1 个答案:

答案 0 :(得分:8)

首先没什么基础 -

  • 每个线程都有自己的Dispatcher和Dispatcher.CurrentDispatcher将始终返回当前正在执行的线程的Dispatcher。
  • BeginInvoke根据DispatcherPriority指定的优先级异步执行指定的委托。

代码问题 - 您将委托放在Dispatcher队列中,用于您创建的辅助线程。但是在辅助线程获得执行它的时间之前,您的辅助线程退出并因此退出其调度程序。这就是代表永远不会被执行的原因。

有两种方法可以实现这一目标 -

将调度程序上的委托同步排队 -

Dispatcher.CurrentDispatcher.Invoke(
                    DispatcherPriority.Normal,
                    new Action(
                        delegate()
                        {
                            Console.WriteLine("Inside invoke?!");
                        }
                    )
                );

或者您可以将它排在主线程的调度程序(通常称为UI线程)上,如下所示 -

Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Normal,
                    new Action(
                        delegate()
                        {
                            Console.WriteLine("Inside invoke?!");
                        }
                    )
                );