【问题标题】:What happens if an asynchronous delegate call never returns?如果异步委托调用永远不会返回会发生什么?
【发布时间】:2011-03-01 05:50:40
【问题描述】:
【问题讨论】:
标签:
c#
.net
asynchronous
timeout
delegates
【解决方案1】:
我觉得this这个帖子讲的很好:
来自帖子:
如果它不是您的线程,您不能终止正在执行的异步委托,但如果是,您可以。如果您使用常见的 BeginInvoke 类型方法,您将获得一个由框架管理的线程池线程。如果您使用 Thread() 类,您将拥有自己的线程来管理、启动、暂停等。
异步开发需要一个人决定谁来管理线程。许多不同的异步执行方法都在后台使用 ThreadPool 线程。
由于您不能/不应该终止线程池线程,因此您必须设计代码以与线程通信,以便它可以退出。 BackgroundWorker 组件的 MSDN 示例演示了这种通信。
有时您的代码可能有线程阻塞等待 IO。在这里,您通常会使用多对象等待,等待 IO 或 ManualResetEvent。
因此,简而言之,如果存在超时的可能性并且您希望线程结束,您需要自己找到一种方法来管理线程。
【解决方案3】:
你会泄露线程持有的资源。会有各种各样的 .NET 远程处理管道对象,例如 AsyncResult。与线程关联的几个非托管句柄。与您将泄漏的由线程堆栈保持的 1 兆字节的虚拟内存地址空间相比,所有这些都是小菜一碟。
您不能以任何方式中止线程,泄漏是永久性的。当您必须处理此类行为不良的代码时,您唯一的好资源就是在单独的进程中运行它,这样当您使用 Process.Kill() 对进程进行头部处理时,您可以让 Windows 清理弹片。即使不能保证,这种冻结往往与行为不端的设备驱动程序有关。 Process.Kill 不会终止设备驱动程序线程。很容易看到:尝试使用 Taskmgr.exe 中止进程将使其仅使用一个句柄运行。如果这没有发生,你还有一些希望。