我想运行一个exe实用程序,它根据给定的参数生成一些二进制输出(这是一个图像)。
我需要将实用程序的二进制输出作为流(MemoryStream
)和错误(如果有)。
它还需要 Timeout ,这样如果应用程序挂起或需要很长时间才能响应,请中断执行并返回输出结果,直到该时间为止。
一种方法是使用cmd,如:
cmd /C ... >out.jpg 2>err.txt
但这需要一个不可接受的临时文件,我想直接捕获输出数据,因为它应该多次调用并且输出大小很大。
运行流程的基本代码如下:
using (var p = new Process())
{
//p.StartInfo = new ProcessStartInfo("cmd", "/C " + command + " > x.jpg 2> err.txt");
p.StartInfo = new ProcessStartInfo()
{
FileName = @"x.exe", //dcraw
Arguments = @"-c -e x.jpg",
UseShellExecute = false, //it is usefull for non-exe like as for a Word file.
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
int timeout = 5000; //msec
p.Start();
//MemoryStream outputStream = ...
//p.OutputDataReceived += ... //can't use this as it returns text not binary data
//string errorText = ...
p.WaitForExit();
//return new pResult(Image.FromStream(outputStream), errorText, isTimedout, ...);
}
如何使用指定的超时获取outputStream和errorText?
注意:我知道有几个关于process.start
和输出重定向的问题。其中大多数是关于捕获文本输出而不是二进制数据(如this或that)。这个binary question并没有像我这里所说的那样完全回答我的问题(同时捕获输出和错误可能导致死端锁,没有指定超时)。