所以我正在尝试创建一个启动第三方exe的应用程序来执行一些文件操作,基于文件名列表。因此,如果列表有 13 个项目,我将经历 13 次循环,每次启动外部进程,通知用户现在正在处理哪个文件,启动进程并等待它退出。为了通知用户,另一个列表框用作喊话框。问题是,.waitforexit() 以某种方式以一种奇怪的方式冻结了整个线程,因此外部程序被称为 nmormaly,文件正常处理,但主窗口被冻结,直到所有项目完成。所以基本上Shoutbox被冻结了,只有在整个循环完成后才会收到所有信息的垃圾邮件。我已经尝试了许多方法来实现这一点,例如启动新线程,使用线程池,计时器等等。任何帮助,不胜感激。法典:
Imports System.Windows.Threading
Imports System.Windows.Forms
Imports System.IO
Imports System.Threading
If Listbox2.Items.Count > 0 Then
tabctrl.SelectedIndex = 2
Listbox3.Items.Add(DateTime.Now.ToString & ": Process initiated.")
For i = 0 To Listbox2.Items.Count - 1
Listbox3.Items.Add(DateTime.Now.ToString & ": Processing :" & Listbox1.Items.Item(i))
If System.IO.File.Exists(Listbox2.Items.Item(i)) = False Then
Dim pInfo As New ProcessStartInfo()
With pInfo
.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
.FileName = System.IO.Directory.GetCurrentDirectory & "" & "myapp.exe"
.argouments = "w/e"
End With
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
p.Dispose()
Else
Listbox3.Items.Add(DateTime.Now.ToString & ":! " & Listbox2.Items.Item(i) & " already exists. Moving to next file..")
End If
Next
Listbox3.Items.Add("*-*")
Listbox3.Items.Add(DateTime.Now.ToString & ": Done.")
End If
问题是您(至少在您发布的代码中)正在 UI 线程上调用WaitForExit()
。UI 线程负责重绘窗口,因此,如果阻止它,例如通过调用 WaitForExit()
,它不会重绘 UI,并且应用似乎已冻结。
你需要做的是在另一个线程或线程池上调用它,我建议使用 Tasks:
Task.Run( Sub()
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
End Sub)
但是,由于您没有对Process.Start()
调用的结果执行任何操作,因此您也可以考虑根本不调用WaitForExit()
。
由于您使用的是VS2013,因此您还可以使用await运算符等待该过程完成:
await Task.Run( Sub()
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
End Sub)
请注意,您还必须将 async
关键字添加到周围的方法中