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

c#

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

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

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

谢谢

回答

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

你相信错误:这是不可能的。Task.Run调度到 ThreadPool,而不是 UI 线程的调度程序。两者是完全分开的。

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

Invoke由于存在死锁的风险,您无论如何都应该避免使用。风险在于 UI 线程正在等待您的线程执行某些操作,并且通过同步等待 UI 线程有足够的空闲时间来处理您的消息,您将面临死锁的风险。

您通常可以BeginInvoke改为使用(有一个后台线程,其进度取决于 UI 正在做什么通常是糟糕的设计),但是当您使用awaitProgress<T>/时很少需要它IProgress<T>

  • `Parallel.ForEach` will use the thread it's called on, plus any number of additional threads as needed. If you call it from the UI thread, yes it will use the UI thread. If you call it from a non-UI thread, it won't use the UI thread.

以上是避免Task.Run导致主线程死锁(C#)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>