Мне не удалось найти ответ, который я ищу уже здесь, но если это его ссылка, я закрою этот дубликат сообщения.Новый процесс не по порядку?
В рамках программы я работаю, я хочу три простых вещи происходят в следующем порядке:
1.) Показать шатер прогресс бар 2.) Выполнить некоторые команды через CMD и двигаться вывод на доступную строку 3.) Остановить/скрыть индикатор выполнения
Проблема, которую я вижу, заключается в том, что мой код не выполняется в порядке, и я очень смущен, почему. Кажется, идет шаг 2-1-3, который невозможен.
Чтобы сделать вещи еще более странными, если я не буду комментировать окно сообщений между шагами 1 и 2, все будет выполнено в порядке.
Есть ли что-то с новым процессом CMD, бросающим это из-под контроля?
Вот мой код для этого метода:
//STEP 1 - Updates label and starts progress bar
lblSelectDiagnostic.Text = "Diagnostic Running";
progressBarDiag.Visible = true;
progressBarDiag.MarqueeAnimationSpeed = 100;
//MessageBox.Show("Status Updated");
//STEP 2 - Runs "Test Internet Connection"
//Gets selected diagnostic name
string strSelectedDiag = listBoxDiagnostics.SelectedItem.ToString();
var name = strSelectedDiag.Substring(strSelectedDiag.LastIndexOf(':') + 1);
strSelectedDiag = name.Trim();
if (strSelectedDiag.Contains("Test Internet Connection"))
{
//Pings Google
ProcessStartInfo info = new ProcessStartInfo();
info.RedirectStandardError = true;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
info.FileName = "cmd.exe";
info.CreateNoWindow = true;
//Creates new process
Process proc = new Process();
proc.StartInfo = info;
proc.Start();
//Writes commands
using (StreamWriter writer = proc.StandardInput)
{
if (writer.BaseStream.CanWrite)
{
writer.WriteLine("ping www.google.com");
writer.WriteLine("exit");
}
writer.Close();
}
string PingGoogle = proc.StandardOutput.ReadToEnd();
proc.Close();
}
//STEP 3 - Resets label and stops progress bar
progressBarDiag.MarqueeAnimationSpeed = 0;
progressBarDiag.Visible = false;
lblSelectDiagnostic.Text = "Select Diagnostic to Run:";
-Спасибо!
Если вы используете все на одном потоке (интерфейс резьба), то интерфейс не будет обновляться, пока после возвращения. Вы не указали достаточно кода, чтобы убедиться, что это правда, но тот факт, что вы взаимодействуете с (как выглядите) элементами интерфейса, делает его в высшей степени возможным. –
Вы не увидите ни одного индикатора выполнения, когда вы запускаете код в том же потоке, который должен рисовать панель. Путаница возникает, когда вы бросаете окно сообщения, которое позволяет обрабатывать события рисования. Ваш подход в корне ошибочен, используйте дорогостоящий код в отдельном рабочем потоке, чтобы он не мог прогнать поток пользовательского интерфейса. BackgroundWorker всегда является хорошим выбором. –
Я не знаком с классом BackgroundWorker, как бы мне создать шаг 2 для запуска с ним? – user1959800