vb.net - .Net 异步委托(delegate)中止

标签 vb.net multithreading asynchronous

背景:我的应用程序用于使用 Selenium RC 执行测试服务器,有时当我调用 Selenium 命令没有返回来自 RC 服务器的响应时,我会遇到问题 - 它最终会阻塞正在执行测试的线程。

示例代码:

Private Delegate Function DoCommand_Delegate(ByVal command As String, ByVal args() As String) As String
...
asyncCommand = New DoCommand_Delegate(AddressOf server.DoCommand)
asyncResult = asyncCommand.BeginInvoke(command, args, Nothing, Nothing)
Try
    ... (I have it use the AsyncWaitHandle to wait for periods of 10 seconds up to two minutes. At the end of each period it runs some checks for common problems that block Selenium from returning a response (modal dialogs) - I don't think that part is relevant to this question, it's just necessary.)
Finally
    result = asyncCommand.EndInvoke(asyncResult)
...

在调用 EndInvoke 时,工作委托(delegate)要么已经完成,要么需要中止。大多数时候它已经有了响应,所以它工作得很好,但在极少数情况下,Selenium RC 的 DoCommand不返回,因此线程被锁定。

最后,我的问题:是否有一种资源友好的方式来中止正在执行的委托(delegate),或者我是否需要将其转换为使用可以中止和处置的手动控制线程?

注意:这不是关于 Selenium 的问题,只是适当的多线程问题。

注释 2: 在调用 EndInvoke 之前,我考虑过在 Finally 中执行以下操作:

If Not asyncResult.IsCompleted Then asyncResult.AsyncWaitHandle.Close()

...但我不知道这是否真的能正常工作,或者可能会造成什么损害。

最佳答案

无法同时执行以下操作:

  • 非合作地中止/终止线程
  • 不破坏与其关联的所有状态(AppDomain/进程)

意味着:要么协同终止(此处不可能),要么终止进程(AppDomain 不够,因为涉及 native 状态),或者不终止线程。

你不能只是不杀死线程并将其卡在那里。程序的其余部分(剩余的测试)可以继续执行。

我不高兴在生产中看到这种情况,但对于测试套件来说这可能没问题(假设挂起无法修复)。

为什么线程不能被中止? Stack Overflow 上已经对此进行了多次介绍。

关于vb.net - .Net 异步委托(delegate)中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888425/

相关文章:

ASP.NET VB 嵌套 ListView

mysql - 如何将 DropDownList 中的正确值插入到数据库表中

multithreading - Jenkins一次运行多个批处理文件

java - 在 Java 中创建一个 Atomic RingBuffer

c# - 在 TaskCompletionSource.Task(已调用 .SetResult)上调用 ContinueWith 方法是否安全?

mysql - 如何在vb.net中使用datepicker搜索日期

java - 在 Java 中,在发出信号的线程和最初获取锁的线程之间的显式锁获取顺序

java - 如何在 JMeter 中测试异步回调?

使用 node.js 处理 Javascript 异步异常

vb.net - 从没有 For Each 循环的 DataTable.Select 中获取第一个结果