winform跨執行緒操作webBrowser控制元件
阿新 • • 發佈:2018-12-23
一、解決問題
在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