*****c#中的委託和事件

from:http://blog.csdn.net/XuWei_XuWei/article/details/18008013編程

quan:c#

對於InvokeRequired,可視線程使用情況決定是否須要,若是多條線程同時訪問有可能,則要,若只有該線程訪問,則不用也能夠。app

---------------異步

下面的敘述是我的理解:async

定義理解

委託:使用形式上和類的方法類似,本質是一個類,編譯器編譯的時候,會把它編譯成相應的類,參數能夠是方法名,測試

事件:是對用戶操做的響應,通常用戶進行了某個操做,便觸發了某個事件,固然了,c#中咱們能夠自定義本身的事件,而後本身在須要的時候編程觸發,ui

委託和事件的關係

事件須要委託來簽名,委託的用途之一就是來給事件簽名的,this

用途

委託:主要有三方面的用途,爲事件簽名和跨線程使用控件和異步方式調用同步方法spa

跨線程調用舉例

//聲明委託.net

private delegate void AppendTextDel(TextBox textBox, string content);

public void AppendText(TextBox textBox, string content)

 {

     if (textBox.InvokeRequired)//判斷textBox是否是跨線程調用
        {
            AppendTextDel append = new AppendTextDel(AppendText);
            textBox.Invoke(append, textBox, content);
        }
        else
        {
            textBox.Text = content + "\r\n" + textBox.Text;//追加文本並換行
        }

 }

//須要爲textbox類型的控件賦值時,調用便可

AppendText(textBox1,「hello world」)

爲事件簽名舉例

public delegate void EventDel();//聲明委託

public event EventDel CustomEvent;//聲明自定義事件,用EventDel委託簽名(其實就是說這個之後只能調用和EventDel委託匹配的方法)

//定義一個EventDel能夠調用的方法

public void MethondA() {

console.writeline("MethondA");

}

//定義一個EventDel能夠調用的方法

public void MethondB() {

console.writeline("MethondB");

}

//測試

public void testMethond() {

this.CustomEvent +=  new EventDel(MethondA);

this.CustomEvent +=  new EventDel(MethondB);

CustomEvent();//觸發自定義事件

}

異步方式調用同步方法舉例

(具體說來就是調用委託的begininvoke和endinvoke來實現的,看代碼)

delegate void MessageDel();

public void CustomMessage() {

console.writeline("異步方式調用同步方法");

}

//要異步方式調用時,以下

MessageDel del = new MessageDel(CustomMessage);

del .begininvoke(asynvcallback委託對象,用戶自定義object類型的對象);

或者

MessageDel del = new MessageDel(CustomMessage);

iasyncresult result = del .begininvoke();

.........//經過result來進行後續處理,兩種調用方法都行

相關文章
相關標籤/搜索