如何在周期定时的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
相关产品推荐
相关产品推荐

