1. 程式人生 > >winform跨執行緒操作webBrowser控制元件

winform跨執行緒操作webBrowser控制元件

一、解決問題

在winform上呼叫百度地圖,使用了webBrowser控制元件。當不跨執行緒時,使用正常。使用子執行緒操作webBrowser控制元件時出現了一下錯誤。

       子執行緒中對窗體上的控制元件操作是會出現異常,這是由於子執行緒和執行窗體的執行緒是不同的空間所導致的。對於一般的控制元件,當子執行緒操作控制元件時,只要在窗體啟動載入時加入以下一句就可以解決跨執行緒問題。

使用執行緒檢查方式為無的方法:

InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;//取消執行緒間的安全檢查   解決執行緒間操作UI問題

但是對於webBrowser控制元件無能為力。

二、解決方案

1、使用 Timer控制元件

由於這個控制元件執行在UI執行緒上,在這個執行緒上註冊一個事件

 不用設定中斷定時時間

private void timer1_Tick(object sender, EventArgs e)

{

    // 需要對webBrowser操作的方法

}

視窗載入時,開啟定時器。這樣做測試可以用,但是控制不靈活,白白佔用了很多CPU,而且不能叫做跨執行緒,只是在UI執行緒上開啟一個定時器輪詢,當子執行緒的引數變化之後會影響到輪詢執行的內容。

2、使用MethodInvoker方法跨執行緒

作用就是讓子執行緒告訴窗體執行緒來完成相應的控制元件操作

//1、設定子執行緒函式
   private void ThreadFun()
        {
           //子執行緒裡呼叫UI執行緒執行InvokeFun()
          MethodInvoker test = new MethodInvoker( this.InvokeFun );
          this.BeginInvoke(test);
        }

//2、設定UI執行緒裡要執行的函式
        private void InvokeFun()
        {

        }
//3、呼叫子執行緒
Thread thdProcess = new Thread( new ThreadStart( ThreadFun ) );
thdProcess.Start();

這種方法使用很簡單的解決了子執行緒呼叫主執行緒的問題。

3、使用委託

參考:https://blog.csdn.net/tonggen7135/article/details/78748067