c# - 在单独的线程上执行进程会导致 System.IO.__Error.WinIOError

标签 c# multithreading process

我正在编写一个基本的 GUI 应用程序,它本质上是在给定一些参数的情况下调用其他进程,而这些应用程序的输出会通过一个富文本框实时显示给用户。所以基本上我有一个单独的进程线程运行子进程。

除了 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();

它有效。所以我不喜欢我重定向输出的方式。话虽如此,我仍然不知道如何使它与当前的系统一起工作。因为这个话题已经严重出轨了,所以我想我应该删除它并重新开始,或者留下它供其他人引用。

关于c# - 在单独的线程上执行进程会导致 System.IO.__Error.WinIOError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1224833/

相关文章:

c# - 相对定位 child 的容器

multithreading - 在 Perl 中,如何从父进程向子进程发送消息(或信号),反之亦然?

c# - 将 Interlocked.CompareExchange 与类一起使用

c# - 使用 Process.Start() 时将异常冒泡回调用者

process - 进程内服务和进程外服务的区别

c# - 从身份验证中排除文件类型的中间件

c# - 将数据库文件路径更改为其安装路径

c# - 重定向后 session 随机结束

multithreading - 使用静态 C++ lib 的 Windows 8 WinRT 应用程序具有多个为 vccorlibd 定义的符号

c - 为什么 vfork() 会出现段错误