免责声明:我知道Thread.Abort
是邪恶的。我正在使用它作为最后的手段,因为一些I / O函数(例如,在不存在的网络共享上使用File.Exists
)会阻塞大量的时间并且不允许您指定超时。
问题:是否可以使用Thread.Abort
中止工作线程(如在Delegate.BeginInvoke
中),或者我是否必须自己进行线程处理?
答案 0 :(得分:3)
在使用Delegate.BeginInvoke调用的委托中发生的线程方法上调用Abort会很危险。
Delegate.BeginInvoke在ThreadPool线程上触发委托。通过Abort终止ThreadPool线程可能会导致非常奇怪的错误,因为ThreadPool不打算处理这个错误。
话虽如此,这也完全没必要。您应始终能够从ThreadPool线程中检测是否要中止,并且只是适当地返回。如果ThreadPool线程被阻止,那也不会是一个问题,因为它没有阻塞你的主线程。最好只在阻止通话后进行检查(即:File.Exists
之后),如果你想在那时中止则返回。
答案 1 :(得分:2)
这样做的唯一方法是让委托将Thread.CurrentThread
传递给主线程。
然而,你不应该这样做;终止ThreadPool线程不是一个好主意。 (除非您取消catch
块中的中止)
你必须使用自己的线程。