我在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?!
,我认为这是最优先考虑的事项。
我也试过在内部放置断点,它从未停在那里。
答案 0 :(得分:8)
首先没什么基础 -
代码问题 - 您将委托放在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?!");
}
)
);