私は小さなアプリケーションを設計していますが、これまでのところ、UI が応答するようにスレッドをシンプルかつ効率的に保つことができて幸運でした。
現在、タブ付きの Web ブラウザー コントロールに大きなローカル html ファイルをロードする必要があるという問題に直面しています。これらのページをロードすると、UI がフリーズします。別のスレッドに存在する Web ブラウザーについて話している多くのスレッドを見てきましたが、それらはすべて Web ブラウザーをメイン UI から遠ざけているように見えました。
私はそれを正しく動作させることができないようです。別のスレッドで html ファイルをメモリ ストリームとして読み込んでから、それを Web ブラウザにフィードしようとしました。別のスレッドで Web ブラウザを作成しようとしましたが、従来のスレッド間例外でシャットダウンされ、SupendLayout を試しました...
今、別のスレッドで作成されたコントロールを別のスレッドのコントロールに追加できないというスレッド ルールについて知っています...私の質問は非常に単純です。大きな html ファイルをロードする方法はありますか?そうしている間にUIをフリーズせずに表示されたWebブラウザで?
これが私の問題を解決するために必要でない場合は、スレッド関連の回答である必要はありませんが、これが私の最後の不自由な試みです:
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);
}
}
どんな助けでも大歓迎です。ありがとう