中止以Delegate.BeginInvoke开头的线程

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

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

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

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

你必须使用自己的线程。

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

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

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