WebBrowser控件在类库中

时间:2014-02-14 06:50:37

标签: .net multithreading webbrowser-control message-loop

正如标题所示,我正在尝试在类库中使用WebBrowser控件。我已经经历过像this excellent post这样的几个SO问题,但在我的情况下,唯一的事情是WebBrowser对象必须在应用程序的生命周期内保持活动状态,并将其状态/ cookie保持在库客户端将要进行的不同调用之间时。

我已经确认WebBrowser控件不会进行导航,除非它创建的线程包含消息泵。但是,只要我引入消息泵,代码就会在Application.Run()调用时阻塞,并且不会生成其他事件。任何帮助都会得到充分的帮助。

1 个答案:

答案 0 :(得分:3)

如果我正确理解了这个问题,你需要在库的生命周期内运行WebBrowser控件的实例,并使其保持活动并独立于具有自己的WinForms消息循环的专用STA线程。

下面的代码展示了如何使用名为MessageLoopApartment的辅助类来完成它。请注意如何在单独的线程上创建和操作WebBrowser

Task Parallel Library在完成同步作业时非常方便。在MessageLoopApartment.Run的STA线程上调度的任务可以与task.Wait()同步或与await task异步等待,结果和异常通过Task.Result / {{从STA线程传播1}},在调用者的堆栈帧上重新抛出异常。

Task.Execption 的实现与.NET 4.0兼容,它不使用任何.NET 4.5功能。客户端代码(MessageLoopApartment导航测试)可选地使用async/await,这可能需要Microsoft.Bcl.Async来定位.NET 4.0。 TPL和WebBrowser极大地简化了对async/await的线程内创建的对象的操作,如MessageLoopApartment

导航测试在_webBrowser内执行,但MainForm_Load_webBrowser的生命周期不受该单个调用的边界限制。两者都在_apartment内被摧毁。测试应用程序是一个WinForms应用程序,但它也可能是一个控制台应用程序或其他任何东西。

MainForm_FormClosed