【问题标题】:Passing void(object, DataReceivedEventArgs) to function将 void(object, DataReceivedEventArgs) 传递给函数
【发布时间】:2013-12-30 07:21:39
【问题描述】:

我正在编写一个函数来创建一个进程并运行它。

这是原来的功能:

public static void LaunchApplication(string runCommand, string commandArguments, string workingDir, string informMessage)
{
    try
    {
        Process applicationProcess = new Process();
        applicationProcess.StartInfo.FileName = runCommand;
        applicationProcess.StartInfo.WorkingDirectory = workingDir;
        applicationProcess.StartInfo.Arguments = commandArguments;
        applicationProcess.StartInfo.UseShellExecute = false;

        WriteHeadlineToConsole(informMessage);

        applicationProcess.Start();
        while (Process.GetProcesses().Any(runningProcess => runningProcess.Id == applicationProcess.Id)) { }

        WriteHeadlineToConsole("Finished " + informMessage);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return;
    }
}

我想将函数的签名更改为:

public static void LaunchApplication(string runCommand, string commandArguments, string workingDir, string informMessage, Func<object, DataReceivedEventArgs> myMethodName)

然后在函数内部,重定向输出,类似于:

applicationProcess.OutputDataReceived += new DataReceivedEventHandler(myMethodName);

这个可以吗?

【问题讨论】:

    标签: c# function process delegates output-redirect


    【解决方案1】:

    试试这个:

    public static void LaunchApplication(string runCommand, string commandArguments, string workingDir, string informMessage, Action<string> redirectOutput, Action<string> redirectError)
    {
        try
        {
            Process applicationProcess = new Process();
            applicationProcess.StartInfo.FileName = runCommand;
            applicationProcess.StartInfo.WorkingDirectory = workingDir;
            applicationProcess.StartInfo.Arguments = commandArguments;
            applicationProcess.StartInfo.UseShellExecute = false;
            applicationProcess.EnableRaisingEvents = true;
            applicationProcess.StartInfo.CreateNoWindow = true;
    
            if (redirectOutput != null)
                applicationProcess.OutputDataReceived += (s, data) => redirectOutput(data.Data);
    
            if (redirectError != null)
                applicationProcess.ErrorDataReceived += (sErr, errData) => redirectError(errData.Data);
    
            GeneralUtils.WriteHeadlineToConsole(informMessage);
            applicationProcess.Start();
            if (redirectOutput != null)
                applicationProcess.BeginOutputReadLine();
            if (redirectError != null)
                applicationProcess.BeginErrorReadLine();
            applicationProcess.WaitForExit();
            GeneralUtils.WriteHeadlineToConsole("Finished " + informMessage);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return;
        }
    }
    

    用法:

    LaunchApplication("cmd.exe", "/C ipconfig /all", "C:\\Windows", "Test", 
                s => Console.WriteLine("HELLO: " + s));
    

    附言: 下面的代码很糟糕! AccessDeniedException可能会被抛出,CPU要疯了!

    while (Process.GetProcesses().Any(runningProcess => runningProcess.Id == applicationProcess.Id)) { }
    

    改用applicationProcess.WaitForExit();

    【讨论】:

    • 我在实现所有更改后测试了代码,但现在我在尝试调用 applicationProcess.BeginOutputReadLine(); 时遇到:StandardOut has not been redirected or the process hasn't started yet. 异常。我用更改更新了您的代码。有什么想法吗?
    • 我没有看到以下行 applicationProcess.StartInfo.RedirectStandardOutput = true;。我认为这是需要的。
    • 我的错,忘记了。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2013-10-19
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2016-06-01
    相关资源
    最近更新 更多