编程语言
首页 > 编程语言> > C#IE BHO:如何将DOM对象编组到工作线程中?

C#IE BHO:如何将DOM对象编组到工作线程中?

作者:互联网

我试图在C#中编写一个Browser Helper Object(BHO),用于在单独的线程上操作DOM.我还看到了与此有关的其他几个问题,答案似乎是“您需要将DOM对象从创建它们的线程中编组到您的工作线程中”.很好的建议,这很合理,但是我找不到有关如何执行此操作的C#示例.有一些需要使用的P / Invoke API的模糊指针,但是我很难理解如何将其实现到BHO中.

我通过示例学习得最好,并且文档中缺少此类的.NET示例.有人可以指出一个示例,其中在托管代码BHO的上下文中,通过工作线程来操作DOM?

解决方法:

您不必执行任何手动封送处理;托管运行时会代表您处理任何跨部门COM对象封送处理.

这是一个例子.此示例托管BHO等待直到DocumentComplete事件触发并启动ThreadPool背景线程,该线程等待一秒钟,然后将页面标题更改为“ Hello,StackOverflow!”.并添加带有特殊消息的新文本节点:

private void OnDocumentComplete(object frame, ref object urlObj)
{
    System.Threading.ThreadPool.QueueUserWorkItem((o) =>
    {
        System.Threading.Thread.Sleep(1000);
            HTMLDocument document = (HTMLDocument)this.browser.Document;
            document.title = "Hello, StackOverflow!";

            IHTMLDOMNode greetings = document.createTextNode("Hi there!");

            IHTMLDOMNode body = document.body as IHTMLDOMNode;
            body.insertBefore(greetings, body.firstChild);                
    }, this.browser);
}

#region IObjectWithSite Members

int IObjectWithSite.SetSite(object site)
{
    if (site != null)
    {
        this.browser = (WebBrowser)site;
        this.browser.DocumentComplete +=
         new DWebBrowserEvents2_DocumentCompleteEventHandler(
          this.OnDocumentComplete);
    }
    else
    {
        if (this.browser != null)
        {
            this.browser.DocumentComplete -=
             new DWebBrowserEvents2_DocumentCompleteEventHandler(
              this.OnDocumentComplete);
            this.browser = null;
        }
    }
    return 0;
}

int IObjectWithSite.GetSite(ref Guid guid, out IntPtr ppvSite)
{
    IntPtr punk = Marshal.GetIUnknownForObject(this.browser);
    int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
    Marshal.Release(punk);

    return hr;
}

#endregion

标签:multithreading,internet-explorer,com,bho,c
来源: https://codeday.me/bug/20191210/2098200.html