VB.NET Marquee进度直到进程退出

时间:2014-09-29 15:45:55

标签: vb.net progress-bar

虽然我有一些 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()

我不完全确定需要做什么,而不是接受正规的培训。

1 个答案:

答案 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。