Dispatcher.Invoke() vs .不创建任何线程
本文关键字:创建 任何 线程 vs Invoke Dispatcher | 更新日期: 2023-09-27 18:17:14
在WPF应用程序中,直接调用方法与将其传递给Dispatcher.Invoke()
之间的区别是什么?根据我到目前为止所读到的,两者都在同一个UI线程中执行,不是吗?
案例1:
public sealed partial class Window
{
private void SomeEventHandler(object sender, EventArgs e)
{
SomeMethod();
}
}
案例2:
public sealed partial class Window
{
private void SomeEventHandler(object sender, EventArgs e)
{
Dispatcher.Invoke(SomeMethod, DispatcherPriority.Send);
}
}
这个问题只有在代码运行在UI线程上时才有意义。显然,如果从工作线程调用, 会有很大的不同。你使用Dispatcher。BeginInvoke,而不是Invoke()。所以让我们从"可能有用"的角度来研究。
是的,在这两种情况下,委托目标都将在UI线程上运行。当运行时,区别在于。当您使用dispatcher . begininvoke()时,它将不会执行,直到您的程序再次空闲并重新进入dispatcher循环。通常在当前方法返回后,它取决于它是如何被激活的。
虽然这听起来毫无意义,但在某些情况下可以是有用的。当方法因事件而被激活,并且在事件处理程序中执行某些操作由于可重入问题而很危险时非常有用。一个典型的危险是当事件再次被触发时,你的代码会因为这个网站的名字而爆炸。或者当代码在事件触发后运行,撤消您在事件处理程序中所做的操作时。使用Dispatcher.BeginInvoke()是延迟事件处理程序代码执行的一种干净的方式。这是c# 5中async/await的工作方式。
当你需要在UI线程上运行一个动作时,你可以从后台线程使用UI线程调度器,例如update TextBox。文本
此外Dispatcher maintains a prioritized queue of work items
,这样您就可以运行具有不同DispatcherPriority的操作例如,您希望您的操作以Background
优先级执行含义是在所有其他非空闲操作完成后处理该操作