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

max*_*axp 1 c# parallel-processing task threadpool

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

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

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

谢谢

can*_*on7 5

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

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

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

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

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

  • `Parallel.ForEach` 将使用它所调用的线程,以及根据需要添加任意数量的附加线程。如果您从 UI 线程调用它,是的,它将使用 UI 线程。如果您从非 UI 线程调用它,它将不会使用 UI 线程。 (3认同)