我在我创建的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!");
}
程序的预期流程应为
然而,正在发生的事情是,while循环中的所有内容都正常运行,而webBrowser2.Navigate
行的除了,直到while循环退出时才显示Url。在Url显示之后,立即出现5条连续消息“操作已完成”(对于表中的5个项目)。我该如何修复流量?
答案 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进行开发,我建议您检查async
和await
操作。这可以解决您的问题。
Async and Await in MSDN