我的问题与 C# 非常相似- 覆盖事件处理程序 - 添加参数
我尝试了 Jon Skeet 的建议,但是每当我的进程引发事件时,我都会收到一个异常,即没有与该进程关联的对象。如果一个进程引发了事件,这怎么可能?
我正在开发一个程序,该程序从文本文件中读取机器列表,然后为每台计算机创建一个进程,该进程启动 cmd.exe 并运行 dir 命令来搜索目标机器中的某个文件。这是我的一些代码。请原谅凌乱,我通常会写一些东西,遇到问题然后在清理之前尝试一堆东西。我对此还是很陌生。
foreach (var machine in machines)
{
using (Process searcher = new Process())
{
searcher.StartInfo = cmd;
searcher.StartInfo.Arguments = "/C dir \\\\" + machine + "\\c$\\*.pst /a/s";
searcher.ErrorDataReceived += new DataReceivedEventHandler(searcher_ErrorDataReceived);
searcher.Start();
searcher.BeginOutputReadLine();
searcher.BeginErrorReadLine();
if (!searcher.HasExited)
{
searcher.OutputDataReceived += (sender, args) => HandleData(procCount, args);
}
else
{
MessageBox.Show(searcher.StandardOutput.ReadToEnd());
}
}
}
我的HandleData
方法如下所示:
private void HandleData(int ID, DataReceivedEventArgs args)
{
if (this.outputBox.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(HandleData);
this.Invoke(d, new object[] { ID, args });
}
else
{
this.outputBox.AppendText(args.Data);
processes[ID] += args.Data + "\n";
}
}
outputBox
是我写入的 Windows 窗体对象,它可以工作,但不适用于在离线计算机上运行命令的进程。线上发生异常
this.outputBox.AppendText(args.Data);
并且是一个NullReferenceException
。args.Data
一片空白。因此,即使 dir 通常输出“机器离线”或类似于命令提示符的内容,它似乎也不会将其写入其输出流,我不知道如何解决这个问题。
我的主要问题是:如何在不丢失我现在拥有的异步读取的情况下将每个进程的输出保持在一起?每个进程都需要开始,做它的事情,然后它写入自己的输出流的每一行都需要保持在一起,这样我就可以完整地读回来。