2013-07-23 110 views
0

我在创建的while循环中遇到了我的程序流问题。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. 导航web浏览器控件脚趾的URL
  4. 当web浏览器控制完成后,做一个测试
  5. 截图
  6. 将结果插入新表
  7. 将原始表中的项目标记为删除
  8. 回到#1,直到所有项目都已被覆盖。

然而,正在发生的事情是一切都在while循环正确为了除了webBrowser2.Navigate线,不显示地址,直到while循环已经退出运行。紧接着Url显示之后,出现了5个“操作已完成”的连续消息(表中的5个项目)。我如何解决流量问题?

回答

1

试试这个解决方案。将你的循环换成另一个线程,而不是UI线程。然后利用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()'?不要在这个块之外调用它,而是在while循环后调用connection.close() –

+0

因此,我在while循环后面调用'reader.Close();',但我认为它是'Start();'行这是导致异常,因为当我删除该行时,我没有得到一个异常,但它仍然无法正常工作。 –

0

Navigate方法可能正在排队一个事件,稍后将在您的代码运行在同一个线程(UI线程)中处理该事件。您可能必须将代码放入单独的background worker thread以允许在循环完成之前处理UI事件。

0

如果您正在使用.NET 4.5 Frammework,我建议您使用asyncawait操作。这可以解决你的问题。 Async and Await in MSDN

+1

需要注意的是异步伺机分别推出.NET 4.5 –

+0

那分辩!感谢编辑。我刚刚编辑了我的问题。 – oimitro