【发布时间】:2018-08-01 09:10:33
【问题描述】:
我启动了几个进程,我想知道哪个进程调用了 OutputHandler,但我无法获得有关发送进程的任何信息。 当我尝试读取一个属性时,它总是抛出一个 InvalidOperationException
void ExecString()
{
using (Process process = new Process())
{
process.StartInfo.FileName = executeExe;
process.StartInfo.Arguments = string.Format("{0}/{1}@{2} @{3}", parameter0, parameter1, parameter2, parameter3);
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputHandler;
process.Start();
process.BeginOutputReadLine();
}
}
void OutputHandler(object sendingProcess, DataReceivedEventArgs output)
{
try
{
OutputText = output.Data;
var tmpProcess = (Process)sendingProcess;
var testId = tmpProcess.Id; // Throw Exception
}
catch (InvalidOperationException e)
{
OutputText = e.Message;
}
}
【问题讨论】:
-
查看文档中的 Process.Id 属性。这是一个记录在案的异常,如果没有 ID 则抛出,因为它尚未设置或因为没有进程。也许路径错误,或者参数导致错误?
-
进程启动后,我得到一个进程 ID,在输出处理程序中,我得到了我期望的数据。只是 sendProcess 对象没有预期的信息。
-
将您需要的参数添加到您的 OutputHandler 方法中,例如 Processs prc。还有一个用于订阅事件的 lambda 表达式,以便您可以传递 process 变量。 using 语句必须执行,进程对象需要保持活动状态,直到它终止。 stackoverflow.com/questions/8644253/…
-
进程 currentProcess = Process.GetCurrentProcess();字符串 pid = Process.Id.ToString();你能试试这个并回复我吗?@user2369332
-
我删除了 using 语句,现在我可以从事件处理程序访问进程信息。非常感谢你们。
标签: c# eventhandler