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

时间:2009-08-03 21:56:25

标签: c# multithreading process

我正在编写一个基本的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句柄。如果有人对类似的问题有过任何体验,或者对此有任何见解,那么它就会受到影响。

3 个答案:

答案 0 :(得分:1)

我认为实际问题与线程没有关系,而是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();

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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