避免任务。运行导致主线程死锁(C#)
我相信,虽然不太可能,但使用避免任务。运行导致主线程死锁(C#),c#,parallel-processing,task,threadpool,C#,Parallel Processing,Task,Threadpool,我相信,虽然不太可能,但使用Task.Run()排队的任务有可能最终在主线程上运行 我担心(在我的WPF应用程序中),如果我在这个任务中使用app.Current.Dispatcher.Invoke(),或者类似的方法,我会导致死锁 这是一种合理的恐惧吗?如果是这样,有没有办法防止这种情况发生(不检查当前线程*不是*主线程) 谢谢 我相信,虽然不太可能,但使用Task.Run()排队的任务最终可能在主线程上运行 你错误地相信:这是不可能的任务。运行调度到线程池,而不是UI线程的调度程序。这两者是
Task.Run()
排队的任务有可能最终在主线程上运行
我担心(在我的WPF应用程序中),如果我在这个任务中使用app.Current.Dispatcher.Invoke()
,或者类似的方法,我会导致死锁
这是一种合理的恐惧吗?如果是这样,有没有办法防止这种情况发生(不检查当前线程*不是*主线程)
谢谢
我相信,虽然不太可能,但使用Task.Run()排队的任务最终可能在主线程上运行
你错误地相信:这是不可能的<代码>任务。运行调度到线程池,而不是UI线程的调度程序。这两者是完全不同的
我担心(在我的WPF应用程序中),如果我在这个任务中使用app.Current.Dispatcher.Invoke()或类似的工具,会导致死锁
无论如何都应该避免使用Invoke
,因为存在死锁的风险。风险在于UI线程正在等待您的线程执行某些操作,而同步等待UI线程有足够的空闲时间来处理您的消息,这可能会导致死锁
您通常可以使用BeginInvoke
(拥有一个后台线程,其进度取决于UI正在做什么,这通常是一个糟糕的设计),但当您使用Wait
和progress
/IProgress
时,很少需要它
我相信,虽然不太可能,但使用Task.Run()排队的任务最终可能在主线程上运行
你错误地相信:这是不可能的<代码>任务。运行调度到线程池,而不是UI线程的调度程序。这两者是完全不同的
我担心(在我的WPF应用程序中),如果我在这个任务中使用app.Current.Dispatcher.Invoke()或类似的工具,会导致死锁
无论如何都应该避免使用Invoke
,因为存在死锁的风险。风险在于UI线程正在等待您的线程执行某些操作,而同步等待UI线程有足够的空闲时间来处理您的消息,这可能会导致死锁
您通常可以使用
BeginInvoke
来代替(拥有一个后台线程,其进度取决于UI正在做什么,这通常是糟糕的设计),但是当你使用wait
和Progress
/IProgress
时,你很少需要这个。我注意到,使用Parallel时,TPL的ForEach
通常会在“主”线程上运行一个线程。是的,此调用会阻止调用线程,因此利用此“备用”线程是有意义的。这是TPL的“魔力”吗?正如MSDN声明的那样,它从线程池并行获得它的分配。ForEach
将使用调用它的线程,以及所需的任意数量的额外线程。如果您从UI线程调用它,那么它将使用UI线程。如果您从非UI线程调用它,它将不会使用UI线程。我注意到使用并行。来自TPL的ForEach
通常会在“主”线程上运行线程。是的,此调用会阻止调用线程,因此利用此“备用”线程是有意义的。这是TPL的“魔力”吗?正如MSDN声明的那样,它从线程池并行获得它的分配。ForEach
将使用调用它的线程,以及所需的任意数量的额外线程。如果您从UI线程调用它,那么它将使用UI线程。如果您从非UI线程调用它,它将不会使用UI线程。