在单独的线程上执行进程会导致System.IO .__ Error.WinIOError

我正在编写一个基本的GUI应用程序,基本上调用给定一些参数的其他进程,而这些应用程序的输出通过richtext框实时显示给用户。 所以基本上我有一个运行子进程的独立进程线程。

大多数进程在该线程上运行正常,除了xdiscbld.exe(一个Xbox ISO映像创建工具)崩溃说:

Unhandled Exception: System.IO.IOException: The handle is invalid. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) at System.Console.get_BufferWidth() at XDiscBld.XDiscBldProgram.ProcessDisc() at XDiscBld.XDiscBldProgram.Run(String[] args) at XDiscBld.XDiscBldProgram.Main(String[] args) 

(顺便说一句,xDiscBld通过命令提示符或单线程进程调用运行正常)

我通常不会发布这样一个特定的错误,但我真的很难过,我认为它可能是与线程的常见问题和保持某种IO句柄有关的通用问题。 如果有人对类似的问题有过任何体验,或者对此有任何见解,那么它就会受到影响。

我相信实际问题与线程没有关系,而是XDiscBld想要写入不存在的控制台窗口。 这是因为我正在开始这样的过程。

 process = new Process(); process.StartInfo.UseShellExecute = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.CreateNoWindow = false; process.StartInfo.FileName = FileName; process.StartInfo.Arguments = Arguments; process.StartInfo.WorkingDirectory = WorkingDirectory; process.Start(); 

如果我只是跑

 process.StartInfo.FileName = FileName; process.StartInfo.Arguments = Arguments; process.StartInfo.WorkingDirectory = WorkingDirectory; process.Start(); 

有用。 所以它不喜欢我如何重定向输出。 话虽如此,我仍然不知道如何使用当前的系统来完成这项工作。 因为这个话题出轨可怕,我想我应该删除它并重新开始,或者留下来供其他人参考。

如果重定向输入/输出,则必须将process.StartInfo.UseShellExecute设置为false ;

这里发生的是您从该进程使用的句柄无效。 出现这种情况有几个原因,最常见的是该进程已经退出,从而使句柄无效。