免责声明:我知道Thread.Abort
是邪恶的。我将它用作最后的手段,因为某些 I/O 函数(例如,File.Exists
在不存在的网络共享上使用时)会阻塞很长时间并且不允许您指定超时。
问题:是否有可能中止(如在Thread.Abort
中)使用Delegate.BeginInvoke
启动的工作线程,或者我有自己处理线程?
最佳答案
在使用 Delegate.BeginInvoke 调用的委托(delegate)中发生的线程方法上调用 Abort 是危险的。
Delegate.BeginInvoke 在 ThreadPool 线程上启动委托(delegate)。通过 Abort 终止 ThreadPool 线程可能会导致非常奇怪的错误潜入,因为 ThreadPool 并非旨在处理此问题。
话虽如此,这也是完全没有必要的。您应该始终能够从 ThreadPool 线程中检测到您是否要中止并适本地返回。如果 ThreadPool 线程被阻塞,那也不会成为真正的问题,因为它不会阻塞您的主线程。最好在阻塞调用之后进行检查(即:在 File.Exists
之后),如果您当时想中止则返回。
关于c# - 中止使用 Delegate.BeginInvoke 启动的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2178607/