代码之家  ›  专栏  ›  技术社区  ›  Joshua Evensen

WebBrowser控件从服务问题执行

  •  2
  • Joshua Evensen  · 技术社区  · 14 年前

    WebBrowser 来自服务的控制。我知道那是不可以的,但它似乎很管用。

    while (browser.readystate != complete)
    Application.DoEvents()
    

    显然,这在服务中是行不通的。

    我也试过这样做:

    public class WebCrawler
    {
        private class ExposedActiveXWebBrowser : System.Windows.Forms.WebBrowser
        {
            public SHDocVw.WebBrowser UnderlyingWebBrowser
            {
                get
                {
                    return ActiveXInstance as SHDocVw.WebBrowser;
                }
            }
        }
        ExposedActiveXWebBrowser worker;
    
        public WebBrowserReadyState ReadyState
        {
            get
            {
                return worker.ReadyState;
            }
        }
    
        public HtmlDocument Document
        {
            get
            {
               return worker.Document;
            }
        }
    
        public WebCrawler()
        {
            worker = new ExposedActiveXWebBrowser();
        }
    
        public void Navigate(string urlString)
        {
            worker.Navigate(urlString);
            while (worker.UnderlyingWebBrowser.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
                Thread.Sleep(0);
        }
    }
    

    我想知道的是——Windows窗体WebBrowser似乎天生就是异步的,那么这是否意味着ActiveX控件已经在自己的线程上执行了呢?

    我可以通过适当的接口访问底层activex控件,然后等待它完成吗?

    4 回复  |  直到 9 年前
        1
  •  2
  •   fletcher    14 年前

    你可以试试 DocumentCompleted 事件。

    来自MSDN:

    在WebBrowser控件完成加载文档时发生。

    ...

        2
  •  2
  •   Joshua Evensen    14 年前

    解决方案:我需要以完全信任的用户身份运行服务。它是通过PermissionSet属性显式需要的。

        3
  •  1
  •   Chris Diver    14 年前

    如果是这样的话,那么有更好的类可以用来做这件事,你不会有这个问题。

    System.Net.WebClient System.Net.HttpWebRequest

        4
  •  0
  •   csharptest.net    14 年前

    +1对于Chris——如果你看不到WebControl,为什么要渲染它?使用类似 HTMLAgilityPack