2

C# 3.5 Winforms 应用程序。

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

我还有另一个线程等待某个进程在启动时结束。例如 winword.exe。

在那个线程中我有这个代码:

p.WaitForExit();

它会坐在那里等待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);
        }



这是我拥有的 ProcessCheck() 方法:

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

        }
    }));
}
4

2 回答 2

5

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

于 2012-07-30T16:51:16.973 回答
0

我不确定,因为以下程序表明只要您正确执行线程,您正在做的事情就可以工作。

static void Main(string[] args)
{
    BackgroundWorker shortThread = new BackgroundWorker(), waitThread = new BackgroundWorker();

    shortThread.WorkerSupportsCancellation = true;
    shortThread.DoWork += (s, e) =>
        {
            while (true)
            {
                if (shortThread.CancellationPending)
                {
                    break;
                }

                Console.WriteLine("Hello World...");
                Thread.Sleep(2000);
            }
        };

    waitThread.WorkerSupportsCancellation = true;
    waitThread.DoWork += (s, e) => { Process.Start("winword.exe").WaitForExit(); };

    shortThread.RunWorkerAsync();
    waitThread.RunWorkerAsync();

    Console.ReadLine();

    shortThread.CancelAsync();
    waitThread.CancelAsync();
}

因此,在我看来,您是WaitForExit()在主线程而不是单独的线程上发出。

于 2012-07-30T16:45:45.517 回答