C# 进程:无法在第二个 运行 上 BeginOutputReadLine 和 CancelOutputRead
C# Process: Cannot BeginOutputReadLine and cannot CancelOutputRead on second run
当我第二次 运行 a Process
时,我在尝试取消之前的读取行时遇到错误,如下所示:
然而,这就是事情变得时髦的地方。如果我 "physically" 将执行点移动到 BeginErrorReadLine()
它应该可以正常工作吗?因为没有 async 操作正在进行,对吗?
错了!
这...令人难以置信,我不知道如何解决它 ;_;
发生这种情况是因为您试图重新使用 Process 对象。这不是一件有效的事情,很多 .NET 类 都是这样的。像线程、窗体、套接字等。你只使用它们中的一个对象一次,当你用完它们时,你应该 Dispose() 对象并创建一个新对象,如果你想再次做同样的事情。
第一个进程停止后运行,_process
变成僵尸。 它的某些 属性仍然有用,例如,您可以使用 ExitCode 来了解它是如何结束的,使用 ExitTime 来了解它何时发生。但这就是它结束的地方,该对象不再对其他任何东西有用,应该被处理掉。您在 CancelErrorRead() 上得到异常,因为您已完成读取错误输出。 BeginErrorReadLine() 上的异常,因为您已经为第一个进程进行了调用。
您必须在前面插入这一行,可能会修改一些我们看不到的其他代码:
_process = new Process();
支持它的 Exited 事件来处理清理。
当我第二次 运行 a Process
时,我在尝试取消之前的读取行时遇到错误,如下所示:
然而,这就是事情变得时髦的地方。如果我 "physically" 将执行点移动到 BeginErrorReadLine()
它应该可以正常工作吗?因为没有 async 操作正在进行,对吗?
错了!
这...令人难以置信,我不知道如何解决它 ;_;
发生这种情况是因为您试图重新使用 Process 对象。这不是一件有效的事情,很多 .NET 类 都是这样的。像线程、窗体、套接字等。你只使用它们中的一个对象一次,当你用完它们时,你应该 Dispose() 对象并创建一个新对象,如果你想再次做同样的事情。
第一个进程停止后运行,_process
变成僵尸。 它的某些 属性仍然有用,例如,您可以使用 ExitCode 来了解它是如何结束的,使用 ExitTime 来了解它何时发生。但这就是它结束的地方,该对象不再对其他任何东西有用,应该被处理掉。您在 CancelErrorRead() 上得到异常,因为您已完成读取错误输出。 BeginErrorReadLine() 上的异常,因为您已经为第一个进程进行了调用。
您必须在前面插入这一行,可能会修改一些我们看不到的其他代码:
_process = new Process();
支持它的 Exited 事件来处理清理。