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. 导航 webBrowser 控件到 URL
  4. 当 webBrowser 控件完成后,做一个测试
  5. 截图
  6. 将结果插入新表
  7. 将原表中的项目标记为删除
  8. 循环回到#1,直到所有项目都被覆盖。

但是,正在发生的事情是 while 循环中的所有内容都按顺序正常运行,但该行除外,该webBrowser2.Navigate行在退出 while 循环之前不会显示 Url。在 URL 显示后,立即出现 5 条连续消息“操作已完成”(针对表中的 5 项)。如何修复我的流量?

4

3 回答 3

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();
    }

我要求工作线程等到文档加载然后继续执行。简单的。

希望这可以帮助

于 2013-07-23T17:41:21.500 回答
0

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

于 2013-07-23T17:11:27.547 回答
0

如果您正在开发 .NET 4.5 框架,我建议您检查async和操作。await这可能会解决您的问题。 MSDN 中的异步和等待

于 2013-07-23T17:19:05.983 回答