簡體   English   中英

一個進程如何阻止另一個進程(該進程產生)?

[英]How can a process be blocking another process (that it spawned)?

我已經編寫了一個用於啟動和停止特定進程的實用程序。 現在,在測試它時,它似乎以某種方式阻止了它生成的過程!

它使用命名的系統事件(請參閱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事件,或者至少讀取重定向的標准輸出,以避免阻塞線程。 文檔中

這些依賴關系可能導致死鎖情況。 當調用者從子進程的重定向流中讀取時,它依賴於子進程。 調用者等待讀取操作,直到子代寫入流或關閉流為止。 當子進程寫入足夠的數據以填充其重定向流時,它取決於父進程。 子進程等待下一個寫操作,直到父進程從完整流中讀取或關閉流為止。 當調用方和子進程彼此等待完成操作時,將導致死鎖,並且兩者都無法繼續。 您可以通過評估調用方和子進程之間的依賴關系來避免死鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM