Можно ли выяснить, когда все Control.BeginInvoke (s) были завершены? - PullRequest
1 голос
/ 12 октября 2011

В моем текущем проекте я использую командную строку и в основном отображаю ее в richTextBox на основе ввода, введенного в textBox, и нажата кнопка.

См. Возникли проблемы с классом Process при перенаправлении вывода командной строки в winform

Одним небольшим обновлением, которое я хочу сделать (может быть не очень маленьким обновлением кода), является то, что кнопка находится в состоянии «отключено», пока командная строка выполняет свое выполнение. Поскольку проект использует «Control.BeginInvoke» для обновления текста в richTextBox, он выполняет «запуск и забывание». Это означает, что на самом деле я не могу повторно включить отключенную кнопку после того, как все «BeginInvokes» были обработаны в пользовательском интерфейсе.

Полагаю, вопрос в том, можно ли получить обратный вызов после того, как все "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 голосов
/ 12 октября 2011

Просто позвоните BeginInvoke снова после всех ваших обновлений, чтобы позвонить EnabledButton впоследствии.

...