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