2013-02-13 3 views
0

Мне не удалось найти ответ, который я ищу уже здесь, но если это его ссылка, я закрою этот дубликат сообщения.Новый процесс не по порядку?

В рамках программы я работаю, я хочу три простых вещи происходят в следующем порядке:

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:"; 

-Спасибо!

+1

Если вы используете все на одном потоке (интерфейс резьба), то интерфейс не будет обновляться, пока после возвращения. Вы не указали достаточно кода, чтобы убедиться, что это правда, но тот факт, что вы взаимодействуете с (как выглядите) элементами интерфейса, делает его в высшей степени возможным. –

+1

Вы не увидите ни одного индикатора выполнения, когда вы запускаете код в том же потоке, который должен рисовать панель. Путаница возникает, когда вы бросаете окно сообщения, которое позволяет обрабатывать события рисования. Ваш подход в корне ошибочен, используйте дорогостоящий код в отдельном рабочем потоке, чтобы он не мог прогнать поток пользовательского интерфейса. BackgroundWorker всегда является хорошим выбором. –

+0

Я не знаком с классом BackgroundWorker, как бы мне создать шаг 2 для запуска с ним? – user1959800

ответ

1

Индикатор выполнения не будет отображаться, потому что вы рисуете его в том же потоке, где находится ваша логика. Вам нужно будет сделать это в другом потоке. Простейший способ будет заключаться в использовании BackgroundWorker

Это поможет вам: http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

+0

Я пробовал thread.Sleep (500), даже thread.sleep (2000), и это не имело никакого значения. – user1959800

+2

Это потому, что ваш сон заставлял поток пользовательского интерфейса спать. BackgroundWorker запускается в отдельном потоке, позволяя потоку пользовательского интерфейса поддерживать сообщения. – GalacticCowboy

+0

Галактика права! Отредактировал мой ответ – bpoiss