3

背景:我的应用程序用于使用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被调用的时候,worker delegate 要么已经完成,要么需要中止。大多数时候它已经有了响应,所以它工作得很好,但在极少数情况下 Selenium RC 的DoCommand不会返回,所以线程在那里被锁定。

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

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

注意2:Finally在调用之前考虑过执行以下操作EndInvoke

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

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

4

1 回答 1

0

无法同时执行以下操作:

  • 以非合作方式中止/杀死线程
  • 不破坏与其相关的所有状态(AppDomain/process)

暗示:要么合作终止(这里不可能)或终止进程(AppDomain 不够,因为涉及本机状态)或不终止线程。

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

我不乐意在生产中看到这一点,但对于测试套件来说这可能没问题(假设无法修复挂起)。

为什么不能中止线程?这已经在 Stack Overflow 上讨论过很多次了。

于 2012-06-05T15:58:18.233 回答