为什么Process.WaitForExit阻止,即使我在一个单独的线程中有它?

fra*_*Xis 2 c# multithreading process winforms

C#3.5 Winforms app.

我有一个计时器,它在单独的线程上每30秒触发一次(它只是将一串文本写入VS输出窗口).

我还有另一个线程,如果它启动等待某个进程结束.例如winword.exe.

在那个帖子中我有这个代码:

p.WaitForExit();
Run Code Online (Sandbox Code Playgroud)

它会坐在那里等待winword.exe退出.这很好.

然而,当它坐在那里等待winword.exe退出时,一个完全独立的线程(将文本发送到输出窗口)上的30秒计时器永远不会运行.

如果我等待3分钟(所以另一个计时器此时应该运行6次,但是在WaitForExit()等待的时候没有),然后我退出winword.exe; 我的其他计时器突然开始运行6次.这就像有计时器事件的积压和突然的.NET想要在同一时间运行它.

为什么p.WaitForExit()似乎阻止了我的整个应用程序,即使我从我的应用程序中的一个单独的线程(不是主UI线程)执行它?

编辑:是的,它在一个单独的线程中.这是我用来启动它的代码:

        try
        {
            Thread t = new Thread(ProcessCheck); // Kick off a new thread
            t.Start();

            ConfigLogger.Instance.LogInfo("++ ProcessCheck thread started @ " + DateTime.Now);
        }
        catch (Exception ipwse)
        {
            ConfigLogger.Instance.LogInfo(ipwse.Message + " " + ipwse.StackTrace);
        }
Run Code Online (Sandbox Code Playgroud)



这是我的ProcessCheck()方法:

foreach (Process p in System.Diagnostics.Process.GetProcessesByName("winword"))
{
    this.Invoke(new MethodInvoker(delegate()
    {                                                                                 
        try
        {
            p.WaitForExit();
        }
        catch (Exception)
        {

        }
    }));
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*hie 5

this.Invoke,如果从WinForms表单完成,将阻止UI线程,直到进程退出.如果Timer是System.Windows.Forms.Timer,则会在UI线程上引发Tick事件.如果UI线程被阻止,这将解释为什么永远不会引发Tick事件.