背景:我的应用程序用于使用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()
...但我不知道这是否真的可以正常工作,或者可能造成什么损害。