虽然我有一些 VBScript经验,但这是我第一次尝试为命令行应用程序创建一个非常简单的VB.NET(Windows窗体应用程序)包装器。请善待!
我有一个非常简单的GUI,有两个按钮,它们都执行动作,我想显示一个选取框进度条,直到动作(读取:过程)完成(读取:退出)。
“保存”按钮执行此操作:
Dim SaveEXE As Process = Process.Start("save.exe", "/whatever /arguments")
从那里开始我的选框进度条:
ProgressBar1.Style = ProgressBarStyle.Marquee
ProgressBar1.MarqueeAnimationSpeed = 60
ProgressBar1.Refresh()
我以为我可以使用SaveEXE.WaitForExit()
但是Marquee会启动,然后在中间停止直到进程退出。对观看者来说不是很有用;他们会认为它挂了。
我想也许我可以做这样的事情,但这会导致我的VB.Net应用崩溃
Do
ProgressBar1.Style = ProgressBarStyle.Marquee
ProgressBar1.MarqueeAnimationSpeed = 60
ProgressBar1.Refresh()
Loop Until SaveEXE.ExitCode = 0
ProgressBar1.MarqueeAnimationSpeed = 60
ProgressBar1.Refresh()
我不完全确定需要做什么,而不是接受正规的培训。
答案 0 :(得分:3)
您可以使用.NET 4.5的新Async / Await功能:
Public Class Form1
Private Async Sub RunProcess()
ProgressBar1.Visible = True
Dim p As Process = Process.Start("C:\test\test.exe")
Await Task.Run(Sub() p.WaitForExit())
ProgressBar1.Visible = False
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
RunProcess()
End Sub
End Class
请注意Async
子声明和RunProcess
关键字声明中的Await
关键字。
您在另一个线程中运行WaitForExit
并使用Await
,只要任务完成,应用程序就会基本停在此行。
然而,这也同时保持您的GUI响应。对于示例,我只显示进度条(之前是不可见的),并在任务完成后隐藏它。
这也避免了任何Application.DoEvents
hocus pocus。