避免 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 正在做的事情通常是糟糕的设计),但是当您使用 await
和 Progress<T>
/IProgress<T>
.
我相信,虽然不太可能,但使用 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 正在做的事情通常是糟糕的设计),但是当您使用 await
和 Progress<T>
/IProgress<T>
.