2013-07-23 2 views
0

У меня возникают проблемы с потоком моей программы в цикле while, который я создал.В то время как поток программы цикла

while (reader.Read()) 
{ 
    // Store scenario information 
    int Id = (int)reader["ScenarioID"]; 
    string Data = reader["ScenarioData"].ToString(); 
    string Url = "http://google.com"; 

    // Initialize result information 
    int HasSucceeded = 0; 
    var screenshot = new Byte[] { }; 

    // Navigate to webBrowser 
    webBrowser2.Navigate(Url); 
    webBrowser2.DocumentCompleted += WebBrowserDocumentCompleted; 

    // Do test 
    TestScenarios(Url, HasSucceeded); 

    // Take screenshot 
    TakeScreenshot(screenshot); 

    // Insert results 
    InsertResults(Id, HasSucceeded, screenshot); 

    // Mark scenario for deletion 
    MarkScenario(Id); 
} 

private void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs Url) 
{ 
    MessageBox.Show("Operation has completed!"); 
} 

Ожидаемый поток программы должен быть

  1. Прочитайте элемент в таблице
  2. Инициализировать несколько переменных/сохранить некоторые значения
  3. Перемещения по обозревательУправлению носку URL
  4. Когда управление веб-браузером закончено, выполните тест
  5. Сделайте снимок экрана
  6. Внести результаты в новый стол
  7. Отметить позицию в исходной таблице для удаления
  8. Петля назад до № 1 до тех пор, пока все предметы не будут покрыты.

Однако то, что происходит это все в то время цикла работает должным образом, чтобы кроме для webBrowser2.Navigate линии, которая не показывает URL-адрес до тех пор, пока цикл не завершается. Сразу после появления Url появляется 5 последовательных сообщений «Операция завершена» (для 5 элементов в таблице). Как я могу исправить поток?

ответ

1

Попробуйте это решение. Оберните свою петлю в другой поток, кроме потока пользовательского интерфейса. затем использовать AutoResetEvent

new Thread(() => 
{ 
    AutoResetEvent signal = new AutoResetEvent(false); 
    while (reader.Read()) 
    { 
     // Store scenario information 
     int Id = (int)reader["ScenarioID"]; 
     string Data = reader["ScenarioData"].ToString(); 
     string Url = "http://google.com"; 

     // Initialize result information 
     int HasSucceeded = 0; 
     var screenshot = new Byte[] { }; 

     Action action =() => 
     { 
      webBrowser2.Tag = signal; 
      // Navigate to webBrowser 
      webBrowser2.Navigate(Url); 
      webBrowser2.DocumentCompleted -= WebBrowserDocumentCompleted; 
      webBrowser2.DocumentCompleted += WebBrowserDocumentCompleted; 
     }; 
     webBrowser2.Invoke(action); 

     signal.WaitOne();//Wait till it finishes 

     // Do test 
     TestScenarios(Url, HasSucceeded); 

     // Take screenshot 
     TakeScreenshot(screenshot); 

     // Insert results 
     InsertResults(Id, HasSucceeded, screenshot); 

     // Mark scenario for deletion 
     MarkScenario(Id); 
    } 
}).Start(); 

    private void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs Url) 
    { 
     MessageBox.Show("Operation has completed!"); 
     ((AutoResetEvent)((WebBrowser)sender).Tag).Set(); 
    } 

Я попросил рабочий поток ждать, пока документ загружается затем продолжить выполнение. просто.

Надеется, что это помогает

+0

Я получаю «неверную попытку вызвать чтение, когда читатель закрыт», но, спасибо, например, я работаю над этим. –

+0

где вы вызываете 'connection.close()'? не вызывайте его за пределами этого блока, вместо этого вызывайте connection.close() после цикла while –

+0

Итак, я вызываю 'reader.Close();' сразу после цикла while, но я думаю, что это строка 'Start();' это вызывает исключение, потому что когда я удаляю эту строку, я не получаю исключения, но это все еще не работает. –

0

Метод Navigate, вероятно, представляет собой очередное событие, которое будет обрабатываться в той же ветке, в которой работает ваш код (поток пользовательского интерфейса). Возможно, вам придется поместить свой код в отдельный файл background worker thread, чтобы разрешить обработку событий пользовательского интерфейса до завершения цикла.

0

Я рекомендую вам выполнить команду async и await, если вы devleloping в .NET 4.5 Frammework. Это, возможно, решит вашу проблему. Async and Await in MSDN

+1

Обратите внимание, что асинхронный и AWAIT были введены в .NET 4.5 –

+0

Rigth Thats! Спасибо за редактирование. Я только что редактировал мой вопрос. – oimitro