中止以Delegate.BeginInvoke开头的线程

时间:2010-02-01 17:14:59

标签: c# .net vb.net multithreading delegates

免责声明:我知道Thread.Abort是邪恶的。我正在使用它作为最后的手段,因为一些I / O函数(例如,在不存在的网络共享上使用File.Exists)会阻塞大量的时间并且不允许您指定超时。

问题:是否可以使用Thread.Abort中止工作线程(如在Delegate.BeginInvoke中),或者我是否必须自己进行线程处理?

2 个答案:

答案 0 :(得分:3)

在使用Delegate.BeginInvoke调用的委托中发生的线程方法上调用Abort会很危险。

Delegate.BeginInvoke在ThreadPool线程上触发委托。通过Abort终止ThreadPool线程可能会导致非常奇怪的错误,因为ThreadPool不打算处理这个错误。

话虽如此,这也完全没必要。您应始终能够从ThreadPool线程中检测是否要中止,并且只是适当地返回。如果ThreadPool线程被阻止,那也不会是一个问题,因为它没有阻塞你的主线程。最好只在阻止通话后进行检查(即:File.Exists之后),如果你想在那时中止则返回。

答案 1 :(得分:2)

这样做的唯一方法是让委托将Thread.CurrentThread传递给主线程。

然而,你不应该这样做;终止ThreadPool线程不是一个好主意。 (除非您取消catch块中的中止)

你必须使用自己的线程。