В моем текущем проекте я использую командную строку и в основном отображаю ее в 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
}