c# - 在WPF UI线程中等待Dispatcher.Invoke

标签 c# wpf multithreading

我有一个BackgroundWorker,有时需要调用UI线程来执行一些工作并检索结果。为此,我在后台线程中使用了以下内容:

App.Current.Dispatcher.Invoke(new Action(() => { /* some code that updates local data */ });

当应用程序退出时,我希望能够告诉BackgroundWorker退出,但我希望允许它完成所有当前操作。换句话说,我想调用BackgroundWorkerObj.CancelAsync(),然后泵送消息,直到线程退出。

我尝试了以下操作,但是后台线程中的Invoke()仍然受阻(尽管UI线程仍在搅动):
Worker.CancelAsync();
while (Worker.IsBusy)
{
    DispatcherFrame Frame = new DispatcherFrame();
    Frame.Continue = false;
    Dispatcher.PushFrame(Frame);
}

正确的方法是什么? UI线程如何在仍从该BackgroundWorker对象执行调用的同时等待BackgroundWorker

最佳答案

这种关闭死锁正是为什么您不应该为此目的使用Invoke的原因。

将其更改为BeginInvoke(),并使用事件将其传回工作线程。

关于c# - 在WPF UI线程中等待Dispatcher.Invoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32595548/

相关文章:

c# - 不用函数直接将字符串限制到一定长度

c# - 在我的 ASP.NET 代码隐藏中使用 StringBuilder 编写 HTML 是一个好习惯吗?

wpf - IEditableObject 与 DataGrid 的用法是什么?

Unix 上的 C++ : Differences in threading libraries?

java - 多个线程在 Java 中读取同一个属性文件会导致性能问题吗?

swift - iOS 13 : threading violation: expected the main thread

c# - 获取另一个项目的程序集版本 (.exe)

c# - 如果条件满足,如何测试 void 方法返回

c# WPF scroll view 根据滚动位置打印

c# - 您可以/如何在 C# WPF 应用程序中托管完整的 VB6 表单?