正如标题所示,我正在尝试在类库中使用WebBrowser控件。我已经经历过像this excellent post这样的几个SO问题,但在我的情况下,唯一的事情是WebBrowser对象必须在应用程序的生命周期内保持活动状态,并将其状态/ cookie保持在库客户端将要进行的不同调用之间时。
我已经确认WebBrowser控件不会进行导航,除非它创建的线程包含消息泵。但是,只要我引入消息泵,代码就会在Application.Run()
调用时阻塞,并且不会生成其他事件。任何帮助都会得到充分的帮助。
答案 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