Vb.net process.start冻结我的申请(VS 2013)
所以我试图制作一个应用程序,启动第三方exe来执行一些文件操作, 基于文件名列表。 因此,如果列表中有13个项目,我将循环13次,每次启动外部进程,通知用户当前正在处理哪个文件,启动进程并等待它退出。要通知用户,另一个列表框用作shoutbox。问题是,.waitforexit()以一种奇怪的方式冻结了整个线程,因此外部程序被称为nmormaly,即文件被正常处理,但主窗口被冻结,直到所有项目都完成。所以基本上,Shoutbox是冻结的,只有在整个循环完成后,才会被垃圾发送所有信息。我尝试了很多方法来实现这一点,比如启动新线程、使用线程池、计时器等等。感谢您的帮助。 代码: 问题是您(至少在您发布的代码中)正在UI线程上调用Vb.net process.start冻结我的申请(VS 2013),vb.net,process,waitforexit,Vb.net,Process,Waitforexit,所以我试图制作一个应用程序,启动第三方exe来执行一些文件操作, 基于文件名列表。 因此,如果列表中有13个项目,我将循环13次,每次启动外部进程,通知用户当前正在处理哪个文件,启动进程并等待它退出。要通知用户,另一个列表框用作shoutbox。问题是,.waitforexit()以一种奇怪的方式冻结了整个线程,因此外部程序被称为nmormaly,即文件被正常处理,但主窗口被冻结,直到所有项目都完成。所以基本上,Shoutbox是冻结的,只有在整个循环完成后,才会被垃圾发送所有信息。我尝试了很多
WaitForExit()
。UI线程负责重新绘制窗口,因此,如果您通过调用WaitForExit()
来阻止它,则它不会重新绘制UI,并且应用程序似乎被冻结
您需要在另一个线程或线程池中调用它,我建议使用:
但是,由于您没有对<代码>进程.Stistar()/Cudio>调用进行任何处理,您也可以考虑不调用<代码> WaIfFExeTo()/<代码>。< /P>
由于您使用的是VS2013,因此还可以使用等待流程完成:
await Task.Run( Sub()
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
End Sub)
请注意,您还必须将async
关键字添加到周围的方法中问题在于您(至少在您发布的代码中)正在UI线程上调用WaitForExit()
。UI线程负责重新绘制窗口,因此,如果您通过调用WaitForExit()
来阻止它,则它不会重新绘制UI,并且应用程序似乎被冻结
您需要在另一个线程或线程池中调用它,我建议使用:
但是,由于您没有对<代码>进程.Stistar()/Cudio>调用进行任何处理,您也可以考虑不调用<代码> WaIfFExeTo()/<代码>。< /P>
由于您使用的是VS2013,因此还可以使用等待流程完成:
await Task.Run( Sub()
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
End Sub)
请注意,您还必须将async
关键字添加到周围的方法中问题在于您(至少在您发布的代码中)正在UI线程上调用WaitForExit()
。UI线程负责重新绘制窗口,因此,如果您通过调用WaitForExit()
来阻止它,则它不会重新绘制UI,并且应用程序似乎被冻结
您需要在另一个线程或线程池中调用它,我建议使用:
但是,由于您没有对<代码>进程.Stistar()/Cudio>调用进行任何处理,您也可以考虑不调用<代码> WaIfFExeTo()/<代码>。< /P>
由于您使用的是VS2013,因此还可以使用等待流程完成:
await Task.Run( Sub()
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
End Sub)
请注意,您还必须将async
关键字添加到周围的方法中问题在于您(至少在您发布的代码中)正在UI线程上调用WaitForExit()
。UI线程负责重新绘制窗口,因此,如果您通过调用WaitForExit()
来阻止它,则它不会重新绘制UI,并且应用程序似乎被冻结
您需要在另一个线程或线程池中调用它,我建议使用:
但是,由于您没有对<代码>进程.Stistar()/Cudio>调用进行任何处理,您也可以考虑不调用<代码> WaIfFExeTo()/<代码>。< /P>
由于您使用的是VS2013,因此还可以使用等待流程完成:
await Task.Run( Sub()
Dim p As Process = Process.Start(pInfo)
p.WaitForExit()
End Sub)
请注意,还必须将
async
关键字添加到周围的方法中WaitForExit
阻塞线程。但是在进程之后/之前,您可以添加Application.DoEvents()
,以便主线程处理其事件。如果一旦启动Application.DoEvents路径,它将永远主宰您的命运,消耗您的时间……因为我忘了提到这是WPF Application.DoEvents()至少在该语法下是不可能的。WaitForExit
阻塞线程。但是在进程之后/之前,您可以添加Application.DoEvents()
,以便主线程处理其事件。如果一旦启动Application.DoEvents路径,它将永远主宰您的命运,消耗您的时间……因为我忘了提到这是WPF Application.DoEvents()至少在该语法下是不可能的。WaitForExit
阻塞线程。但是在进程之后/之前,您可以添加Application.DoEvents()
,以便主线程处理其事件。如果一旦启动Application.DoEvents路径,它将永远主宰您的命运,消耗您的时间……因为我忘了提到这是WPF Application.DoEvents()至少在该语法下是不可能的。WaitForExit
阻塞线程。但是在进程之后/之前,您可以添加Application.DoEvents()
,以便主线程处理其事件。如果一旦启动Application.DoEvents路径,它将永远主宰您的命运,消耗您的时间……因为我忘了提到这是WPF Application.DoEvents()至少在这种语法下是不可能的..等待方法实际上解决了这个问题!!!我必须将Async添加到按钮点击处理程序中,并添加您发布的等待代码,以达到预期效果。谢谢。太好了:)我应该提到,我会编辑回复以备将来参考。等待方法实际上解决了问题!!!我必须将Async添加到按钮点击处理程序中,并添加您发布的等待代码,以达到预期效果。谢谢。太好了:)我应该提到t