【问题标题】:VB.NET Marquee Progress Until Process ExitsVB.NET 字幕进度直到进程退出
【发布时间】:2014-09-29 15:45:54
【问题描述】:

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


我不完全确定需要做什么,除非接受一些正式培训。

【问题讨论】:

  • 改用 Exited 事件。分配 SynchronizingObject 以使其安全。

标签: vb.net progress-bar


【解决方案1】:

您可以为此使用 .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

注意RunProcess sub 和Await 关键字声明中的Async 关键字。

您在另一个线程中运行WaitForExit,并且通过使用Await,只要任务需要完成,应用程序基本上就会停在这一行。
然而,这同时也让您的 GUI 保持响应。对于示例,我只显示进度条(之前它是不可见的)并在任务完成后将其隐藏。

这也避免了任何Application.DoEvents 恶作剧。

【讨论】:

  • 很好的解释,它符合要求。我进一步修改它以在运行时禁用按钮并在完成后重新启用。 超级简单!非常感谢您出色且迅速的回答!
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多