C#大标准输入的处理中断

时间:2012-09-19 08:15:07

标签: c# process gnupg

我需要通过GnuPG加密来加密文件内容。 为此,我从FILE获取内容并通过StandardInput传递它。对于小数据,它工作正常但是当我尝试写入超过500KB数据的StandardInput时,程序就会卡住。

    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();

请建议解决方案? 我应该以块的形式发送文件数据吗?

1 个答案:

答案 0 :(得分:0)

顺便问一下,您尝试通过的数据是什么?是文本还是二进制数据?如果是二进制文件,请尝试写入StandardInput.BaseStream。我认为stdin在默认情况下处于文本模式,如果传递了某些字节,如EOF或NULL,则会被破坏。请参阅https://stackoverflow.com/a/1284753/717732

编辑:

我在评论中是正确的 - 如果子进程没有足够快地读取数据(或者根本没有读取),则流缓冲区将被阻塞并且所有写入都将被阻塞,就像缓冲区时的读取阻塞一样空。请参阅示例How to avoid standard input getting stuck in c# process

您可以轻松地验证这一点:创建一个在无限循环中从stdin读取的小应用程序。然后,暂时用一个微小的测试应用程序替换你的gpgexecutable路径,看看是否有块。它很可能不会阻止。

您一定要检查子进程没有读取您尝试发送的数据的原因。也许命令行参数错了?或者如果一切看起来都很好而且只是子进程工作得那么慢(你可以在TaskMonitor中查看进程的活动 - gpg是休眠还是旋转?),然后将流编写代码放到一些后台工作中......