You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET/C#如何从外部任务终止正在运行的方法

解决测试类中监控任务终止测试步骤的问题

嘿,我明白你要做的事——给测试类加个独立监控任务,一旦导轨打开就立刻停掉测试步骤对吧?你的示例代码里还没把终止逻辑和测试步骤关联起来,我来给你改改,用VB.NET里标准的任务取消机制来实现,比自定义异常靠谱多了!

核心思路

我们用CancellationTokenSource来传递终止信号:监控任务检测到导轨打开时,发送取消信号;测试步骤在执行过程中定期检查这个信号,一旦收到就立刻终止流程。这种方式是.NET官方推荐的多任务取消方案,线程安全且可控性强。

修改后的完整代码

Module Module1
    Class Test
        Private cts As CancellationTokenSource
        Private monitorTask As Task

        ' 启动测试流程的入口方法
        Public Sub StartTesting()
            ' 初始化取消令牌源,用来生成终止信号
            cts = New CancellationTokenSource()
            ' 启动独立的监控任务,传入取消令牌
            monitorTask = Task.Run(AddressOf Monitor, cts.Token)

            ' 执行测试步骤,并处理终止异常
            Try
                PerformTestSteps(cts.Token)
                Debug.Print("测试正常完成")
            Catch ex As OperationCanceledException
                Debug.Print("测试因导轨打开被终止")
            Finally
                ' 无论测试成功还是终止,都要清理资源
                cts?.Cancel() ' 确保监控任务也能退出
                monitorTask?.Wait() ' 等待监控任务结束
                cts?.Dispose() ' 释放令牌源资源
            End Try
        End Sub

        ' 监控导轨状态的任务方法
        Private Sub Monitor()
            Dim i = 0
            ' 循环监控,直到收到取消信号
            While Not cts.Token.IsCancellationRequested
                Debug.Print("监控中... 当前计数: " & i)
                i += 1
                ' 模拟检测到导轨打开的逻辑(替换成你实际的检测代码)
                If i > 5 Then
                    Debug.Print("检测到导轨打开,触发终止信号")
                    cts.Cancel() ' 向所有关联任务发送终止信号
                    Exit While
                End If
                ' 模拟监控间隔(避免CPU占用过高,替换成你实际的检测频率)
                Task.Delay(500).Wait(cts.Token)
            End While
        End Sub

        ' 示例测试步骤方法
        Private Sub PerformTestSteps(token As CancellationToken)
            For step = 1 To 10
                ' 每次执行步骤前检查是否需要终止
                token.ThrowIfCancellationRequested()
                Debug.Print("正在执行测试步骤 " & step)
                ' 模拟测试步骤的耗时操作(替换成你的实际测试代码)
                Task.Delay(1000).Wait(token)
            Next
        End Sub
    End Class
End Module

关键部分说明

  • CancellationTokenSource & CancellationToken:这对搭档负责在监控任务和测试步骤之间传递终止信号,是线程安全的,不用担心多线程冲突。
  • Monitor方法:循环检测导轨状态,一旦触发条件就调用cts.Cancel()发送信号,同时自己也监听取消信号,确保能正常退出循环。
  • PerformTestSteps方法:在每个测试步骤的开头调用token.ThrowIfCancellationRequested(),如果收到终止信号就抛出OperationCanceledException,直接终止测试流程。
  • 资源清理:在Finally块里确保取消监控任务、等待它结束并释放资源,避免内存泄漏。

注意事项

  • 如果你的测试步骤是异步方法,可以直接用Await Task.Delay(..., token),这样系统会自动处理取消,不用手动抛出异常。
  • 不要用全局变量来传递终止信号,CancellationToken是更规范、更安全的选择。
  • 实际项目中,把示例里的计数判断替换成你真实的导轨状态检测代码就行。

内容的提问来源于stack exchange,提问作者alain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:15:18