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

如何在周期定时的VB.NET Windows Service中统计VB6 exe进程时长及处理等待逻辑

解答

第一个问题:Process.Start会不会自动等待VB6 EXE结束?

不会。System.Diagnostics.Process.Start() 是异步调用,启动外部程序后会立刻向下执行后续代码,不会主动等待进程退出。

第二个问题:5秒定时器会不会暂停计时?

不会。Windows服务常用的System.Timers.Timer、System.Threading.Timer都是按固定间隔触发事件,不管上一次事件的处理逻辑有没有执行完成。如果你的VB6程序运行时长超过5秒,定时器会再次触发事件,导致同时启动多个VB6进程,要注意避免并发问题。

第三个问题:等待VB6程序完成+获取执行时长的实现代码

你可以通过Process.WaitForExit()方法主动等待VB6程序退出,同时记录起止时间计算执行时长,VB.NET示例代码如下:

Imports System.Diagnostics

' 定时器事件处理逻辑
Private Sub Timer_Elapsed(sender As Object, e As ElapsedEventArgs)
    ' 先停用定时器,避免本次处理未完成时重复触发
    DirectCast(sender, Timers.Timer).Enabled = False
    
    Dim vb6Proc As New Process()
    Try
        ' 配置VB6程序启动参数
        vb6Proc.StartInfo.FileName = "C:\你的程序路径\目标程序.exe"
        ' 无界面运行配置(适合服务场景)
        vb6Proc.StartInfo.CreateNoWindow = True
        vb6Proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        vb6Proc.StartInfo.UseShellExecute = False
        
        ' 记录启动时间
        Dim startAt As DateTime = DateTime.Now
        ' 启动VB6程序
        vb6Proc.Start()
        ' 等待程序退出,可传入毫秒数设置超时,比如WaitForExit(30000)代表最多等30秒,避免永久卡住
        vb6Proc.WaitForExit()
        
        ' 计算执行时长
        Dim runDuration As TimeSpan = DateTime.Now - startAt
        ' 此处可添加你的自定义判断逻辑,比如根据时长、VB6程序的退出码做处理
        ' vb6Proc.ExitCode 可以拿到VB6程序的退出码,用于判断是否执行成功
        
    Catch ex As Exception
        ' 此处添加异常日志记录逻辑,比如程序路径不存在、启动失败等场景
    Finally
        ' 释放资源
        vb6Proc.Dispose()
        ' 恢复定时器,下次间隔后继续触发
        DirectCast(sender, Timers.Timer).Enabled = True
    End Try
End Sub

额外注意事项

  • 如果你的VB6程序有交互UI、需要读取当前登录用户的桌面资源,会因为Windows服务的会话0隔离机制运行异常,建议使用无界面、无用户交互的VB6程序。
  • 如果你不需要完全禁止定时器并发,也可以用静态锁变量控制同一时间只有一个处理逻辑在执行,避免重复启动VB6程序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 00:54:04