Завершить один поток, начать другой. Или вариант как сделать верно
Всем привет!
Выполняю команды в CMD, вывод приходит из StreamReader в textbox Так же присутсвует ProgressBar.
Мне надо дождаться выполнения как бы это странно не звучало потока, и начать новый.
Иначе я не получаю последовательный вывод из CMD + ProgressBar отключается раньше времени тут: progressBar.Invoke(new MethodInvoker(() => { progressBar.Visible = false; }))
private void buttonGetSoft_Click(object sender, EventArgs e)
{
Info("Установка MyAsus");
progressBar.Visible = true;
buttonGetSoft.Enabled = false;
string script1 = @"/C cd C:\Windows\System32 && winget install 9N7R5S6B0ZZH --accept-package-agreements";
Task task = new Task(() => DoWork(script1, System.Windows.Forms.Button));
task.Start();
//
// Как вот это разделить, что бы они последовательно выполнялись? Но не Асинхронно, иначе я не смогу получить построчный вывод из CMD, в textbox.
//
Info("Проверка Версии MS WinGet");
buttonGetSoft.Enabled = false;
progressBar.Visible = true;
string script = @"/C winget -v";
Task task1 = new Task(() => DoWork(script, sender as System.Windows.Forms.Button));
}
Метод который выводит поток ( инфу из CMD ) в textbox:
public void DoWork(string script, Control control)
{
Process cmd = new Process();
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.Verb = "runas";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = script;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.WaitForExit();
if (!cmd.StartInfo.RedirectStandardOutput)
{
MessageBox.Show("Невозможная ошибка");
return;
}
string eline;
StreamReader sr = cmd.StandardOutput;
while (!sr.EndOfStream)
{
eline = sr.ReadLine();
textboxInfo.Invoke(new MethodInvoker(() => {
textboxInfo.Text += eline + Environment.NewLine;
textboxInfo.SelectionStart = textboxInfo.TextLength;
Thread.Sleep(5);
textboxInfo.ScrollToCaret();
}));
}
control.Invoke(new MethodInvoker(() => { control.Enabled = true; }));
progressBar.Invoke(new MethodInvoker(() => { progressBar.Visible = false; }));
}
Либо я не понимаю, как это объединить с backgroundWorker. Там я не могу получить построчный вывод на лету.
Направьте пожалуйста, или может простой пример кому не жалко, я хорошо понимаю именно на них.
Источник: Stack Overflow на русском