2012-09-19 83 views
0

我需要通過GnuPG加密來加密文件的內容。 爲此,我從FILE中提取內容並通過StandardInput傳遞它。對於小數據,它工作正常,但是當我嘗試寫入超過500KB數據的StandardInput時,程序卡住了。C#進程中斷大標準輸入

process = new Process(); 
    process.StartInfo.WorkingDirectory = _bindirectory; 
    process.StartInfo.RedirectStandardInput = true; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.RedirectStandardError = true; 
    process.StartInfo.FileName = gpgExecutable; 
    process.StartInfo.Arguments = gpgOptions; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.CreateNoWindow = true; 

    process.Start(); 
/*****Here is the line where Compiler Process Stucks on large data****/ 
    process.StandardInput.Write(inputText); 
    process.StandardInput.Flush(); 
    process.StandardInput.Close(); 

    process.OutputDataReceived += process_OutputDataReceived; 
    process.ErrorDataReceived += process_ErrorDataReceived; 
    process.BeginErrorReadLine(); 
    process.BeginOutputReadLine(); 
    process.WaitForExit(); 

請提出解決方案? 我應該發送文件的數據塊?

+0

如果你的程序執行完畢,那麼這不是**編譯器的錯誤。很久以前,該計劃已經啓動,彙編階段已經結束。請稍微注意一下術語..但這是一件小事。你還沒有說最重要的:**當程序中斷時它看起來如何**? **它如何「卡住」?任何例外?崩潰?日誌?消息?蹤跡? – quetzalcoatl

+0

您可能想要在啓動過程之前連接那些'... Received'處理程序。否則,你可能會錯過一些事件。 –

+0

@Quetzalcoatl: 沒有任何反應。我離開應用2個薄荷糖NO崩潰或出現異常,不能看到堆棧跟蹤或日誌 – nalaiqChughtai

回答

0

順便說一句,你試圖通過什麼數據?它是文本還是二進制數據?如果是二進制文件,請嘗試寫入StandardInput.BaseStream。我認爲,標準輸入是文本模式在默認情況下,如果通過像EOF或NULL一定的字節可以得到破..看到https://stackoverflow.com/a/1284753/717732

編輯:

我的就在我的意見 - 如果子進程不足夠快地讀取數據(或根本不讀取)流緩衝區將被阻塞,並且所有寫入將被阻塞,就像緩衝區爲空時的讀取阻塞一樣。例如見How to avoid standard input getting stuck in c# process

您可以很容易地驗證這一點:創建一個小型應用程序,它從無限循環中的標準輸入讀取。然後,用一個小小的測試應用暫時替換你的gpgexecutable路徑,看看是否有阻止。它很可能不會阻止。

您一定要檢查子進程沒有讀取您嘗試發送的數據的原因。也許命令行參數是錯誤的?或者,如果一切似乎都很好,它僅僅是子進程的工作,所以慢慢地(你可以檢查TaskMonitor進程的活動 - 做的GPG睡眠或自旋?),然後把數據流寫入代碼到一些BackgroundWorker的..

+0

寫作文本,而不是二進制 – nalaiqChughtai

+0

呃..奇怪的..好了,如果它掛在該行並沒有異常和CanWrite是真的,那麼我能想到的唯一原因是,子進程停止讀取數據FOMR標準輸入和標準輸入的緩衝區已用完的空間和它造成您的過程無限等到有在緩衝區空間寫入另一個數據塊。這不過是一個完整的猜測。如果我找到時間,我會明天嘗試創建類似的兩個項目併發送幾個文本,並檢查當沒有人讀取管道時它的行爲。 – quetzalcoatl

+0

我已經更新了答案。 Doubke檢查你的gpg參數,並嘗試一些保證閱讀測試應用程序。 – quetzalcoatl

相關問題