gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:43:19 25 4
gpt4 key购买 nike

背景:我的应用程序用于使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com