Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#_Multithreading_Exception_Threadpool - Fatal编程技术网

C# 使线程将异常传播到上线程

C# 使线程将异常传播到上线程,c#,multithreading,exception,threadpool,C#,Multithreading,Exception,Threadpool,如果我错了,请纠正我,但我注意到通过ThreadPool.QueueUserWorkItem(GoneFishing)从池中选择的线程显然“吞咽”了该线程中发生的任何异常 这给我们带来了很多麻烦,因为我们已经设计了一个有序的线程链,所以如果一个线程没有很好地完成,那么接下来的所有线程链都会被打乱 最合适的处理方法是什么? < P>如果您考虑使用.NET 4,当任务< /代码>被加入时,任务< /代码>所抛出的任何异常都会自动传播到父线程。请看这里: 对于其他相关的解决方案,请检查以下问题:如果每

如果我错了,请纠正我,但我注意到通过
ThreadPool.QueueUserWorkItem(GoneFishing)
从池中选择的线程显然“吞咽”了该线程中发生的任何异常

这给我们带来了很多麻烦,因为我们已经设计了一个有序的线程链,所以如果一个线程没有很好地完成,那么接下来的所有线程链都会被打乱


最合适的处理方法是什么?

< P>如果您考虑使用.NET 4,当<代码>任务< /代码>被加入时,<代码>任务< /代码>所抛出的任何异常都会自动传播到父线程。请看这里:


对于其他相关的解决方案,请检查以下问题:

如果每个线程都依赖于前一个线程,为什么不将程序设为单线程?@japreiss:你完全正确。你的问题的简单答案是:因为我真的很笨。我们花了数周的时间试图设计一个多线程应用程序来卸载整个链上的负载,因为它被数百万字节的数据轰炸,在我们得出结论之前。我问这个问题只是为了深入了解线程异常(并消除我的智力挫败感),你断言异常正在被吞噬。这只发生在.NET1.x中,而不是在.NET2.0及更高版本中。那么到目前为止的结论是什么?您确实在使用旧的.NET版本,还是问题尚未解决?@HansPassant我使用的是.NET 4,到目前为止,当一个单独的线程发生异常时,我在主线程中没有异常。后台工作人员+1也一样。如果您没有加入
任务
,您可以始终
ContinueOnFaulted
并在continuence中自己重新抛出异常。很抱歉,但是。。。这一直困扰着我:如果我们只是为了让线程完成使用Join,那么使用线程有什么意义呢?@Mika Jacobi:在很多情况下,你需要等待线程完成。想象一下,生成多个线程并行执行活动,然后等待它们完成,然后使用它们的结果执行其他操作。@Tudor-很少有人应该等待线程实际终止。发出任务完成的信号很好,持续创建线程并等待Join()只会带来问题——总体性能差和锁定。如果Join()是从语言(Java和Delphi TThread.WaitFor)删除的,那么总体上问题就会少一些——开发人员将被迫使用合理、高效的线程间通信、应用程序线程的生命周期和线程池。实际的发信号通知线程终止的行为就是问题所在。如果去掉它,Join()就没有什么可做的了。在任何内核上,只有一种特定的方法可以停止处于任何状态的线程,并且只有在进程终止时操作系统才能使用这种方法。如果开发人员停止停止线程,就不会有停止线程的问题:)