我正在设计一个小型应用程序,到目前为止,我很幸运能够保持我的线程简单高效,因此 ui 是响应式的。
现在我面临一个问题,我需要在选项卡式 Web 浏览器控件中加载大型本地 html 文件。这些页面的加载会冻结用户界面。我看到很多线程都在谈论生活在另一个线程中的网络浏览器,但所有这些似乎都将网络浏览器排除在主用户界面之外。
我似乎无法让它正常工作。我尝试将 html 文件作为内存流加载到另一个线程中,然后将其提供给 webbrowser,我尝试在另一个线程中创建 webbrowser,但由于经典的线程间异常而关闭,尝试 SupendLayout ...
现在,我知道线程规则指出您不能将在另一个线程中创建的控件添加到来自其他线程的控件...我的问题很简单,有没有办法加载一个大的 html 文件在显示的网络浏览器中这样做时不会冻结用户界面?
如果不需要解决我的问题,则无需成为与线程相关的答案,但这是我最后一次也是一种蹩脚的尝试:
public void openHtml(string input, bool isHtml = true, string tabTitle = "")
{
if (!this.loading)
{
this.loading = true;
ManualResetEvent resetEvent = new ManualResetEvent(false);
Panel panel = new Panel();
TabPage tab = new TabPage();
WebBrowser browser = null;
Thread t = new Thread(() =>
{
browser = new WebBrowser();
browser.CreateControl();
browser.SuspendLayout();
resetEvent.Set();
if (isHtml)
browser.DocumentText = input;
else
browser.Navigate(input);
Application.Run();
});
t.IsBackground = true;
t.SetApartmentState(ApartmentState.STA);
t.Start();
resetEvent.WaitOne();
panel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
panel.Controls.Add(browser);
panel.Dock = DockStyle.Fill;
browser.ObjectForScripting = new JsScriptInterface(this, browser);
browser.Dock = DockStyle.Fill;
tab.Controls.Add(panel);
tab.Text = tabTitle;
this.tabs.TabPages.Add(tab);
}
}
任何帮助将不胜感激。谢谢