[英]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.