避免 Task.Run 导致主线程死锁 (C#)

Avoiding Task.Run causing deadlock on Main thread (C#)

我相信,虽然不太可能,但使用 Task.Run() 排队的任务有可能在主线程上结束 运行。

我担心(在我的 WPF 应用程序中),如果我在这个任务中使用 App.Current.Dispatcher.Invoke() 或类似的东西,我会导致死锁。

这是一种真实的恐惧吗?如果是这样,有没有办法防止这种情况发生(不检查当前线程*是否*是主线程)。

谢谢

I believe, while unlikely, that it is possible for a Task queued up using Task.Run() to end up running on the Main thread.

你的看法是错误的:这是不可能的。 Task.Run 分派给线程池,而不是 UI 线程的分派器。两者完全不同。

I'm concerned that (in my WPF app), If I am using App.Current.Dispatcher.Invoke(), or similar, inside this Task, I will cause a deadlock.

你应该避免使用 Invoke 无论如何,因为死锁的风险。风险在于 UI 线程正在等待您的线程做某事,并且通过同步等待 UI 线程有足够的空闲时间来处理您的消息,您有死锁的风险。

您通常可以改用 BeginInvoke(后台线程的进度取决于 UI 正在做的事情通常是糟糕的设计),但是当您使用 awaitProgress<T>/IProgress<T>.