2013-04-29 87 views
0

我正在嘗試解決一個困難的任務,其中一部分控制檯應用程序是在幾年前編寫的。控制檯應用程序的源代碼已經丟失,重寫它最有可能需要幾百小時。我已經能夠通過使用下面的代碼片斷黑客進入了前級應用程序使用控制檯應用程序:外部控制檯應用程序控制

solver = new Process(); 
solver.StartInfo.FileName = "HPTSolver.exe"; 
solver.StartInfo.UseShellExecute = false; 
solver.StartInfo.RedirectStandardInput = true; 
solver.Start(); 

然後我就可以通過提供必要的輸入參數,通過觸發控制檯應用程序

solver.StandardInput.WriteLine("RunCalculation"); 

控制檯應用程序的結果進行保存爲文本文件,並在頂級應用程序我目前等待文件繼續之前創建:

while (!File.Exists("result.txt")) 
    Thread.Sleep(50); 

所以最後我的問題與最後一部分有關,我等待創建結果文件。儘管我目前的解決方案有效,但它顯然是最天真的解決方案。是否有更好的解決方案來檢測結果文件的創建並允許頂級應用程序繼續?我已經嘗試讀取控制檯應用程序的標準輸出,但數據只在應用程序關閉時輸出,所以這不是一個選項。

回答

1

你有沒有想過使用FileSystemWatcher?

MSDN Link

希望幫助

保羅

+0

這很完美。謝謝。我如何提高你的答案? – CanCan 2013-04-29 12:58:27

+0

我測試了FileSystemWatcher,但不幸的是比現在的解決方案慢了大約100。 – CanCan 2013-04-29 13:19:48

+0

以什麼方式慢?這很重要嗎?在對文件系統進行更改和引發事件之間可能會有一段延遲,但是我認爲這會比在文件寫入之前坐在一個循環中的CPU佔用更少。 – 2013-04-29 15:13:23

1

大約等待控制檯應用程序退出怎麼辦?

solver = new Process(); 
solver.StartInfo.FileName = "HPTSolver.exe"; 
solver.StartInfo.UseShellExecute = false; 
solver.StartInfo.RedirectStandardInput = true; 
solver.Start(); 

solver.WaitForExit() 

或者您可以抓住StdOut並觀察特定消息。

+0

^這似乎是一個更清潔的解決方案。 – KingCronus 2013-04-29 16:05:40

+0

在啓動控制檯應用程序時有開銷。我目前的實施已經更快。我已經討論了在OP中捕獲stdout的問題。 – CanCan 2013-04-29 17:45:53