我正在尝试从我的主应用程序ChildProcess.exe
运行其他进程,让我们假设Main.exe
,并且我希望没有挂起,因为我没有尝试捕获输出,只有shell执行。但不知何故,我的Main.exe
在某些情况下会挂起。这两个可执行文件都有.NET表单,但在尝试访问窗口句柄之前会出现此问题。基本上我所做的就是下面的事情。
MAIN.EXE
这是我为流程执行代码创建新线程的方法
...
ThreadStart^ threadStart = gcnew ThreadStart(this, &MyForm::CreateNewProcessThread);
Thread^ thread = gcnew Thread(threadStart);
thread->Start();
...
这是线程函数
System::Void MyForm::CreateNewProcessThread() {
String^ ApplicationPath = Application::ExecutablePath->Substring(0, Application::ExecutablePath->LastIndexOf("\\"));
...
Process^ p = gcnew Process();
p->StartInfo->FileName = ApplicationPath + "\\ChildProcess.exe";
p->StartInfo->UseShellExecute = true;
p->StartInfo->RedirectStandardOutput = false;
p->StartInfo->RedirectStandardError = false;
p->Start();
...
}
ChildProcess没什么特别的。您可以尝试一个空表单应用程序,这没关系。当我尝试同时运行多个进程时,我的主应用程序开始挂起。它不像死锁一样永远挂起。它只挂起不到1秒钟,但它仍然在第一个进程执行时挂起。当ChildProcess.exe
启动(完全加载)一次后,Main.exe
不会受到影响。但是如果我们为Form_Load
事件设置一个无限循环,比如“while(1);”并且尝试同时执行一些进程(仅限3或4),Main.exe
几乎完全被锁定。
这可能是由STAThread
结构引起的,但由于我使用System.Windows.Forms
命名空间,这看起来是必须的。
我不明白的是,如果我把无限循环放到我的线程(MyForm::CreateNewProcessThread()
),我的应用程序根本不受这个无限循环的影响,因为它是一个单独的线程。但是当我尝试从该线程启动进程时,我的整个应用程序(包括我的主线程)都会受到影响。
我对这个问题有两个问题。
1)原因是什么?
2)解决方案是什么?
P.S:我在stackoverflow上检查了类似的线程,但没有一个提供真正的解释或真正的解决方案。请不要给我链接其他stackoverflow问题。我已经检查了所有这些。
答案 0 :(得分:1)
我无法找到解决问题的“托管”方式。所以我使用了Win32 API(CreateProcess()
,FindWindow()
,WaitForInputIdle()
,EnumThreadWindows()
等。现在它没有挂起,但我仍然不知道.NET的Process类有什么问题。