c# - 中止使用 Delegate.BeginInvoke 启动的线程

标签 c# .net vb.net multithreading delegates

免责声明:我知道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/

相关文章:

c# - 用 AfterBuild 替换 <appname>.exe.config 不适用于 <appname>.vshost.exe.config

c# - 我怎样才能自动启动windows服务

c# - WPF 中的 Application.DoEvents() 在哪里?

c# - 使用上一页获取 GridView 选定行值

c# - includes() 函数不起作用

c# - 声明子类要实现的方法的正确方法是什么?

.net - 如果javascript被禁用,如何在服务器上检查?

c# - SqlDataReader 和数据库访问并发

javascript - VB Now.Ticks 等价于 javascript

mysql - 无法将 MySQL 日期/时间值转换为 System.DateTime。无法存储 0/0/0000 0 :00:00 value?