3

我在 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!片刻后被打印出来,并且应用程序没有像使用线程所期望的那样被阻塞,但是,为什么我从来没有看到Inside invoke?!?我还尝试了不同的优先级,例如Send,我认为这是最高优先级。

我也尝试过在里面设置断点,但它从未停止过。

4

1 回答 1

8

首先是一些基础知识 -

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

代码问题 - 您将委托放置在您创建的辅助线程的调度程序队列中。但是在辅助线程有时间执行它之前,您的辅助线程退出了它的调度程序。这就是为什么委托永远不会被处决的原因。

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

像这样同步调度调度程序上的委托 -

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?!");
                        }
                    )
                );
于 2012-06-24T15:09:01.143 回答