Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免任务。运行导致主线程死锁(C#)_C#_Parallel Processing_Task_Threadpool - Fatal编程技术网

避免任务。运行导致主线程死锁(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线程。