我在 Visual Studio 中创建了一个程序,其中包含程序列表和每个程序的复选框。您选择所需的程序,单击按钮,然后它就会静默安装,无需用户交互。我正在尝试为此添加一个进度条,但似乎无法使其正常工作。
我的进度条是在form_load期间设置的
ProgressBar1.Minimum = 0
ProgressBar1.Value = 0
ProgressBar1.Step = 1
我从 if...then 语句开始来查找哪些被检查...
If Chk_VC.Checked Then Install_VC() 'Visual C++ Redistributable
If Chk_dotnet.Checked Then Install_dotnet() 'Microsoft .Net Desktop Runtime
然后运行功能来安装特定程序...
Function Install_VC() 'Visual C++ 2015-2022
arg.FileName = "...installs\Microsoft\Framework\VC_redist_2015-2022_14.38.33130_x64.exe"
arg.Arguments = "/install /passive /norestart"
Process.Start(arg).WaitForExit()
Return True
End Function
Function Install_dotnet()
arg.FileName = "...\installs\Microsoft\Framework\Microsoft .Net Desktop Runtime\windowsdesktop-runtime-6.0.25-win-x64.exe"
arg.Arguments = "/install /passive /norestart"
Process.Start(arg).WaitForExit()
Return True
End Function
现在我已经尝试了 ProgressBar1.PerformStep() 和 ProgressBar1.Increment(1) ,并在 Button_click 和各个函数中进行了变化。进度条仅在一切运行完成后才会进度。
所以我想我可以尝试使用 ProgressBar1.Refresh() 和 Application.DoEvents() 刷新进度条或表单本身,但仍然无法正常显示。
任何帮助将不胜感激!谢谢你。
尝试在不同的线程上调用
WaitForExit()
,这样它就不会阻塞您的主 UI...
类似:
Sub Install_VC() 'Visual C++ 2015-2022
arg.FileName = "...installs\Microsoft\Framework\VC_redist_2015-2022_14.38.33130_x64.exe"
arg.Arguments = "/install /passive /norestart"
Dim x = WaitForProcess(arg)
End Sub
Sub Install_dotnet()
arg.FileName = "...\installs\Microsoft\Framework\Microsoft .Net Desktop Runtime\windowsdesktop-runtime-6.0.25-win-x64.exe"
arg.Arguments = "/install /passive /norestart"
Dim x = WaitForProcess(arg)
End Sub
Private Async Function WaitForProcess(ByVal args As ProcessStartInfo) As Task
Await Task.Run(Sub()
Process.Start(args).WaitForExit()
End Sub)
ProgressBar1.PerformStep()
End Function