【问题标题】:What Would Cause A Form To Freeze Upon Executing Code什么会导致表单在执行代码时冻结
【发布时间】:2012-10-06 21:26:24
【问题描述】:

我试图弄清楚为什么我的表单在执行某些代码时会冻结。我也无法最小化或移动表单。是不是因为过程中用到了WaitForExit

以下代码与按钮单击相关。

If Checkbox1.checked = True Then
   Call Test()
End If

If Checkbox2.checked = True Then
   Goto NextStep
Else
   Goto StopProcessing
End If

这是我正在调用的测试潜艇。使用可选参数调用 exe。

        Using psinfo As New Process
            psinfo.StartInfo.FileName = "C:\Temp\Test.exe "
            psinfo.StartInfo.Arguments = Arg1
            psinfo.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
            psinfo.Start()
            psinfo.WaitForExit()
        End Using

添加了WaitForExit(所以我认为)在处理完成之前不处理下一条语句(下一条语句是 Checkbox2 的 If 语句)。不是这样吗?

【问题讨论】:

  • 我不太清楚你在问什么,但是是的,WaitForExit() 会停止你的执行,直到进程退出。
  • 我有一种感觉。好的,谢谢,我回到绘图板。

标签: vb.net visual-studio-2010 process waitforexit


【解决方案1】:

WaitForExit 被添加(所以我认为)在处理完成之前不处理下一个语句(下一个语句是 Checkbox2 的 If 语句)。

当您调用WaitForExit 时,它会阻塞直到进程 (Test.exe) 完成。

由于您在用户界面线程上运行它,它会导致您的表单“冻结”,直到该过程完全完成。

如果您不希望发生这种情况,则需要在后台线程上等待。您可能会将此代码移动到 BackgroundWorker 并使用它与您的主窗口同步 - 但您需要处理“等待”以使该过程以不同的方式完成(即:预先禁用您的 UI,运行进程,完成后重新启用)。

请注意,对于 Process 类,另一种选择是在进程上添加 EnableRaisingEvents,然后将处理程序添加到 Process.Exited。这样您就不会WaitForExit(),而是会在流程完成时通过事件获得通知。

【讨论】:

  • 感谢您的意见。我使用WaitForExit 有一种感觉,它反过来锁定了界面。我会看看你的建议,再次感谢。
  • 一个简单的问题,拥有多个后台工作人员有意义吗?我拥有的每个进程的 IE 浏览器?
  • @Muhnamana 根据您的操作,事件方法可能会更好。如果您要同时运行这些进程,那么 >1 BW 是有意义的。如果你想一次运行一个,那么一个更有意义。
  • 好的,谢谢。我想我已经掌握了我需要的方法。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多