是否有可能弄清楚所有Control.BeginInvoke已经完成的时间?

时间:2011-10-11 22:53:01

标签: c# winforms delegates callback begininvoke

在我当前的项目中,我正在接受一个命令提示符,并且基于在textBox中键入的输入并按下按钮,在richTextBox上显示它。

请参阅Having trouble with Process class while redirecting command prompt output to winform

我想做的一个小更新(可能不是一个特别小的更新代码-wize)是在命令提示符执行时按钮处于“禁用”状态。由于该项目使用“Control.BeginInvoke”来更新richTextBox上的文本,因此它会“一劳永逸”。这意味着一旦将所有“BeginInvokes”处理到UI,我就无法重新启用禁用按钮。

我想问题是,一旦执行了所有“BeginInvokes”并且说“嘿,我已经完成,这是你的按钮返回”,是否有可能获得回调。这将阻止用户点击发送重复进程的按钮。

以下是我正在使用的代码片段:

public void GetConsoleOuput(string command = null)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "cmd.exe";
    startInfo.RedirectStandardOutput = true;
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;

    if (!string.IsNullOrEmpty(command))
    {
        startInfo.Arguments = command;
    }

    Process process = new Process();
    process.StartInfo = startInfo;
    process.OutputDataReceived += new DataReceivedEventHandler(AppendRichBoxText);

    process.Start();
    process.BeginOutputReadLine();
    process.Close();
}

public void AppendRichBoxText(object sendingProcess, DataReceivedEventArgs outLine)
{
    string outputString = args.Data;
    MethodInvoker append = () => richTextBox.AppendText(outputString);
    richTextBox.BeginInvoke(append);
}

// Would like EventHandler method to enable button once all "BeginInvokes" are
// done running asynchronously due to a callback.
public void EnableButton
{
    /// re-enable a disabled button
}

1 个答案:

答案 0 :(得分:0)

只需在所有更新后再次致电BeginInvoke,然后再致电EnabledButton