UPDATE:关键部分是我们使用的流对于copyto \ copytoasync使用的缓冲区来说太大了,所以我们需要异步处理流,而不是异步运行整个任务部分,如下面链接的问题
请原谅这里的VB.net代码。我也会说C#所以请随意使用这两种语言。
我一直在关注这里的示例ProcessStartInfo hanging on "WaitForExit"? Why?,以便尝试解决我们用完缓冲区空间的问题
以前我们尝试过这段代码:
Dim buffer As Byte() = New Byte(32767) {}
Dim file As Byte()
Using ms = New MemoryStream()
While True
Dim read As Integer = Process.StandardOutput.BaseStream.Read(buffer, 0, buffer.Length)
If read <= 0 Then
Exit While
End If
ms.Write(buffer, 0, read)
End While
file = ms.ToArray()
End Using
If Not Process.WaitForExit(timeOut) Then
Throw New Exception("Html to PDF conversion timed out.")
End If
现在我已经开始将此转换为链接问题的aynch方法,但是在写入内存流而不是字符串构建器时遇到了麻烦。这是我到目前为止所得到的:
Dim output = new MemoryStream()
Dim errorOutput = new StringBuilder()
Using process = New Process()
Using outputWaitHandle As New AutoResetEvent(False)
Using errorWaitHandle As New AutoResetEvent(False)
process.OutputDataReceived = Function(sender, e)
If e.Data Is Nothing Then
outputWaitHandle.Set()
Else
output.Write(e.Data); //compile error here
End If
End Function
End Using
End Using
End Using
当然e.Data是一个字符串,但不仅如此,我还需要一个缓冲区和一个偏移...而且不确定在这里提供什么。
欢迎任何建议,谢谢!
答案 0 :(得分:1)
您可以直接使用流:
,而不是使用OutputDataReceived
static async Task<MemoryStream> ReadProcessOutput(ProcessStartInfo psi)
{
MemoryStream ms = new MemoryStream();
using (Process p = new Process())
{
p.StartInfo = psi;
TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
EventHandler eh = (s, e) => tcs.TrySetResult(0);
p.Exited += eh;
try
{
p.EnableRaisingEvents = true;
p.Start();
await p.StandardError.BaseStream.CopyToAsync(ms);
await tcs.Task;
}
finally
{
p.Exited -= eh;
}
}
return ms;
}
答案 1 :(得分:0)
您可能希望使用StreamWriter类而不仅仅是MemoryStream。这将允许你做这样的事情:
MemoryStream output = new MemoryStream();
StreamWriter outputWriter = new StreamWriter(output);
...[snip]...
outputWriter.Write(e.Data);