2012-09-19 56 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

相关问题