【问题标题】:C# get EventHandler process informationC#获取EventHandler进程信息
【发布时间】: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


【解决方案1】:

你可以试试这个,它可能对你有帮助;

Process currentProcess = Process.GetCurrentProcess(); 
var pid = currentProcess.Id; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多