循环程序流程

时间:2013-07-23 17:04:17

标签: c# flow

我在我创建的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直到所有项目都被覆盖。
  9. 然而,正在发生的事情是,while循环中的所有内容都正常运行,而webBrowser2.Navigate行的除了,直到while循环退出时才显示Url。在Url显示之后,立即出现5条连续消息“操作已完成”(对于表中的5个项目)。我该如何修复流量?

3 个答案:

答案 0 :(得分: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();
    }

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

希望这有帮助

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

相关问题