2013-01-14 62 views
0

我正在开发一个小型内部使用实用程序来监视多个网站的正常运行时间和响应。我们有非常专业的要求和标准来测试,因此为此开发了一个小型应用程序。我如何有效地管理在主线程中运行的准'任务'

我必须使用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 

} 
+0

我们不能说如何改善代码,如果我们没有基线!代码请 – RhysW

+0

@RhysW我试图添加一个简化版本的代码 – Dan

回答

0

基于模型可能是一个更好的办法的事件;而不是循环。

我会添加一些OnPropertyChanged事件处理程序到div或由ajax查询更新的容器,而不是循环。

private void DocumentCompletedHandler(object sender, EventArgs e) 
{ 

    HtmlElement elem = webctrl.Document.GetElementById("ajaxDiv"); 

    if (elem != null) 
    { 
      elem.AttachEventHandler("onpropertychange", new EventHandler(ajaxEvent)); 
    } 

} 

与处理器

private void ajaxEvent(Object sender, EventArgs e) 
{ 
     HtmlElement div = webctrl.Document.GetElementById("ajaxDiv"); 
     if (div == null) return; // Not Found!? 
     String contentLoaded = div.InnerHtml; // get the content loaded via ajax 
} 

考虑到相同的结构,你可以火了一个中断事件或类似中止操作的东西。或者,您可以使用stop命令停止Web控制上的所有处理 - 尽管我不确定这是否会停止Ajax处理。

private void BtnAbort_Click(Object sender, EventArgs e) 
{ 
    webctrl.Stop(); 
    // TODO : Remov any event handlers 
} 
相关问题