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來進行後續處理,兩種調用方法都行