狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#中Invoke的用法

admin
2021年1月29日 21:18 本文熱度 3501

在多線程編程中,我們經(jīng)常要在工作線程中去更新界面顯示,而在多線程中直接調(diào)用界面控件的方法是錯(cuò)誤的做法,Invoke 和 BeginInvoke 就是為了解決這個(gè)問題而出現(xiàn)的,使你在多線程中安全的更新界面顯示。

正確的做法是將工作線程中涉及更新界面的代碼封裝為一個(gè)方法,通過 Invoke 或者 BeginInvoke 去調(diào)用,兩者的區(qū)別就是一個(gè)導(dǎo)致工作線程等待,而另外一個(gè)則不會(huì)。 

Framework框架的WinForm構(gòu)建GUI程序界面時(shí),如果要在控件的事件響應(yīng)函數(shù)中改變控件的狀態(tài),例如:某個(gè)按鈕上的文本原先叫“打開”,單擊之后按鈕上的文本顯示“關(guān)閉”,初學(xué)者往往會(huì)想當(dāng)然地這么寫:

void ButtonOnClick(object sender,EventArgs e)

{

button.Text="關(guān)閉";

}

這樣的寫法運(yùn)行程序之后,可能會(huì)觸發(fā)異常,異常信息大致是“不能從不是創(chuàng)建該控件的線程調(diào)用它”。注意這里是“可能”,并不一定會(huì)觸發(fā)該種異常。造 成這種異常的原因在于,控件是在主線程中創(chuàng)建的(比如this.Controls.Add(...);),進(jìn)入控件的事件響應(yīng)函數(shù)時(shí),是在控件所在的線 程,并不是主線程。在控件的事件響應(yīng)函數(shù)中改變控件的狀態(tài),可能與主線程發(fā)生線程沖突。如果主線程正在重繪控件外觀,此時(shí)在別的線程改變控件外觀,就會(huì)造 成畫面混亂。不過這樣的情況并不總會(huì)發(fā)生,如果主線程此時(shí)在重繪別的控件,就可能逃過一劫,這樣的寫法可以正常通過,沒有觸發(fā)異常。

正確的寫法是在控件響應(yīng)函數(shù)中調(diào)用控件的Invoke方法(其實(shí)如果大家以前用過C++ Builder的話,也會(huì)找到類似Invoke那樣的激活到主線程的函數(shù))。Invoke方法會(huì)順著控件樹向上搜索,直到找到創(chuàng)建控件的那個(gè)線程(通常是主線程),然后進(jìn)入那個(gè)線程改變控件的外觀,確保不發(fā)生線程沖突。

而所謂的“一面響應(yīng)操作,一面添加節(jié)點(diǎn)”永遠(yuǎn)只能是相對(duì)的,使 UI 線程的負(fù)擔(dān)不至于太大而已,因?yàn)榻缑娴恼_更新始終要通過 UI 線程去做,我們要做的事情是在工作線程中包攬大部分的運(yùn)算,而將對(duì)純粹的界面更新放到 UI 線程中去做,這樣也就達(dá)到了減輕 UI 線程負(fù)擔(dān)的目的了。

舉個(gè)簡(jiǎn)單例子說明下使用方法,比如你在啟動(dòng)一個(gè)線程,在線程的方法中想更新窗體中的一個(gè)TextBox:

using System.Threading; 

//啟動(dòng)一個(gè)線程 
Thread thread=new Thread(new ThreadStart(DoWork)); 
thread.Start(); 

//線程方法 
private void DoWork() 

this.TextBox1.Text="我是一個(gè)文本框"; 


如果你像上面操作,在VS2005或2008里是會(huì)有異常的,正確的做法是用Invoke\BeginInvoke:

using System.Threading;
namespace test
{
public partial class Form1 : Form
{
public delegate void MyInvoke(string str1,string str2);
public Form1()
{
InitializeComponent();

}
public void DoWork()
{
MyInvoke mi = new MyInvoke(UpdateForm);
this.BeginInvoke(mi, new Object[] {"我是文本框","haha"});
}
public void UpdateForm(string param1,string parm2)
{
this.textBox1.Text = param1+parm2;
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
}
}
}
注意代理的使用!


該文章在 2021/1/29 21:18:10 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved