繁体   English   中英

为什么即使我在单独的线程中,Process.WaitForExit也会阻止?

Why does Process.WaitForExit block even though I have it in a separate thread?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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)
        {

        }
    }));
}
2 个回复

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

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

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()

4 即使Process.HasExited为true,Process.WaitForExit也不会返回

我使用Process.Start启动批处理文件。 批处理文件使用“ START”命令并行启动多个程序,然后退出。 批处理文件完成后,Process.HasExited变为true,并且Process.ExitCode包含正确的退出代码。 但是,当我调用Process.WaitFor ...

2014-11-03 11:32:07 1 9425   c#/ .net/ f#
5 为什么Process.WaitForExit不等待?

为什么Process.WaitForExit不等待? 它不断循环并一次又一次启动应用程序! 编辑: 现在它可以正常工作了,因为像这样的clsProcess.WaitForExit(1000);所以它clsProcess.WaitForExit(1000); ...

6 Process.WaitForExit不等待

我有以下代码,并且WaitForExit方法没有等待。 它只是运行命令并继续执行下一条语句。 该命令用于取消安装应用程序,而参数用于卸载命令。 卸载运行良好,但我需要卸载完成后才能继续...它没有阻止。 ...

2011-02-11 18:15:57 1 1958   c#-2.0
8 process.waitforexit挂起

不要标记下降投票,直到您没有完全阅读为止。 但是,同一标题下存在许多问题,但没有一个起作用,我想解决我的特定问题。 请帮忙。 我正在使用C#4.0 Asp.Net应用程序,在按钮上的网页上单击我要创建一个exe。 这样我就在使用devenv.exe ,但是它挂在process.wai ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM