我正在研究其他人编写的代码。它包含一个后台工作程序,从其 DoWork 调用 Dispatcher.Invoke。
我的问题是我认为我的 BackgroundWorkerCompleted 将在我的 Dispatcher.Invoke 完成之前发生。那是对的吗?
Dispatcher.Invoke 会启动一个新线程还是从主线程启动?
将 Dispatcher 与 Backgroundworker 混合是一个坏主意吗?我发现的样本似乎只使用了其中一个。
我正在研究其他人编写的代码。它包含一个后台工作程序,从其 DoWork 调用 Dispatcher.Invoke。
我的问题是我认为我的 BackgroundWorkerCompleted 将在我的 Dispatcher.Invoke 完成之前发生。那是对的吗?
Dispatcher.Invoke 会启动一个新线程还是从主线程启动?
将 Dispatcher 与 Backgroundworker 混合是一个坏主意吗?我发现的样本似乎只使用了其中一个。
我的问题是我认为我的 BackgroundWorkerCompleted 将在我的 Dispatcher.Invoke 完成之前发生。那是对的吗?
不,那不正确。
Dispatcher.Invoke 会启动一个新线程还是从主线程启动?
不,它将在 UI 线程上执行代码。因此,它将防止您获得跨线程异常。通常用于修改 GUI 内容。
在 WPF 中,只有创建 DispatcherObject 的线程才能访问该对象。例如,从主 UI 线程分离的后台线程无法更新在 UI 线程上创建的 Button 的内容。为了让后台线程访问 Button 的 Content 属性,后台线程必须将工作委托给与 UI 线程关联的 Dispatcher。这是通过使用 Invoke 或 BeginInvoke 来完成的。Invoke 是同步的,而 BeginInvoke 是异步的。操作被添加到指定 DispatcherPriority 的 Dispatcher 的事件队列中。