一个进程如何阻塞另一个进程(它所产生的进程)

本文关键字:进程 一个 何阻塞 另一个 | 更新日期: 2023-09-27 18:11:14

我写了一个实用程序,用来启动和停止一个特定的进程。现在,在测试中,它似乎以某种方式阻止了它生成的过程!

它使用命名系统事件(参见system . threading . eventwaithandle)。启动进程后,它等待设置事件:

private static int StartRavenDB(string fileName, string workingDirectory, string arguments)
{
    var process = new Process
    {
        StartInfo =
        {
            FileName = fileName,
            WorkingDirectory = workingDirectory,
            Arguments = arguments,
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardInput = true,
            RedirectStandardOutput = true
        }
    };
    process.Start();
    var eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, "StartStopRavenDBUtility");
    eventWaitHandle.Reset();
    eventWaitHandle.WaitOne();
    process.StandardInput.WriteLine("q");
    process.WaitForExit();
    return process.ExitCode;
}

现在,启动的RavenDB进程是侦听localhost:8080的web服务器。

使用上述实用程序启动该进程后不久,该进程不响应web请求。它一直在计时。一旦我终止了实用程序进程,一切都开始正常工作。

为了记录,我100%的EventWaitHandle还没有设置- RavenDB进程在那里,但它没有表现得像它应该的。

我不知道发生了什么或为什么,这是一个完全独立的过程。是什么导致了这个问题?

一个进程如何阻塞另一个进程(它所产生的进程)

您应该订阅OutputDataReceived事件,或者至少读取重定向的标准输出,以避免阻塞线程。来自文档:

这些依赖关系可能导致死锁条件。当来电者从子进程的重定向流中读取,它是依赖的在孩子身上。调用方等待读取操作,直到子进程写入流或关闭流。子进程写入足够的数据来填充其重定向流,这是依赖的父。子进程等待下一个写操作,直到父进程读取整个流或关闭流。调用方和子进程等待时,将导致死锁彼此完成一个操作,都不能继续。你可以通过评估调用者和之间的依赖关系来避免死锁子进程。