我正在开发一个小型内部使用实用程序来监视多个网站的正常运行时间和响应。我们有非常专业的要求和标准来测试,因此为此开发了一个小型应用程序。我如何有效地管理在主线程中运行的准'任务'
我必须使用WebBrowser控件加载网站,因为它具有JavaScript和插件所需的权限。 (测试必须尽可能真实世界)结果,我的测试必须在GUI线程中运行,目前在“DocumentCompleted”事件中。
此外,我测试的网站是AJAX沉重的,所以我必须在我的逻辑中实施等待期以确保DOM按照我的预期加载。例如,我检查使用while循环登录页面时是否存在标签。
我的理念证明能够按预期工作,我对结果非常满意。但是,我正在努力如何使这个更“面向任务”。例如,我需要实现一个超时期限和用户取消正在进行的功能。例如,登录页面可能失败,因此永远不会显示正确的输入。
目前,我可以看到的唯一方法是在每一步执行逻辑来检查UserCancel
变量或检查秒表。
我担心我在我的应用程序的体系结构中做出了一个根本不好的选择,所以我正在寻求如何实现上述和改进代码的建议。
private void TestSite(string url){
webBrowser.Naviate(url);
stopwatch.Start();
}
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
if(stopwatch.Elapsed.Seconds > timeOutValue || userCancel){
//Task timed out, or user has cancelled
return;
}
//Switch to the relevant application logic
//siteStatus is defined by where I expect the website to be at any particular time.
switch(siteStatus)
{
case siteStatus.LogonPage:
if(DocumentTitle != ExpectedDocumentTitle){
//Page is unexpected. Handle this and return
}
//Title is correct, wait until website has built the DOM
while(stopwatch.Elapsed.Seconds < timeOutValue || !userCancel || webBrowser1.Document.GetElementsByTagName("input").Count() < 2){
//Carry on
Application.DoEvents();
}
if(stopwatch.Elapsed.Seconds > timeOutValue){ return; }
if(userCancel){ return; }
//Business logic goes here. Reports on time taken, ensures correct elements are on the page
break;
case siteStatus.Menu:
//Essentially as above with different logic and tests
break;
//etc etc
}
我们不能说如何改善代码,如果我们没有基线!代码请 – RhysW
@RhysW我试图添加一个简化版本的代码 – Dan