c# 通過delegate委托向主線程發送信息


c# windows編程,常會用到多線程,在新開的線程中要對主線程的頁面數據進行更改時,需要通過delegate進行委托

 public delegate void show(string  info); //定義一個委托,參數為string private void add_info_event(string info) //定義一個方法,判斷控件是否需要引用才可操作,將該方法與委托進行綁定,並用Invoke調用該委托和傳遞參數。
 {
    if (this.txb_info.InvokeRequired)
    {
       show d = new show(add_info_event);  //聲明一個show委托,並且該委托指向add_info_event方法 this.Invoke(d, new object[] { info });  //引用該委托,並傳遞參數
    }
    else
    {
     add_info(info);  //調用真正的代碼邏輯
    }
}

在子線程代碼中,直接調用add_info()屬於跨線程操作,無法操控主線程內容,調用add_info_event()即可。

 

擴展:如果主form,生成一個子form,子form要對主form的進行通信,更改內容,也可以使用delegate和event相配合。

子form1:

   public delegate void sendMessage(string message); //定義一個委托,發送消息 public event sendMessage sendTo; //聲明一個事件,類型為sendMessage   調用sendTo(string message)向主窗體通信

主form:

Form1 form1=new Form1();
//主窗體的構造方法
public Form(){
 form1.show(); form1.sendTo
+= new Form1.sendMessage(SendArgs); //將子窗體的sendTo事件類型為sendMessage委托,並將委托與主窗體中的SendArgs方法綁定; } public delegate void getMessage(string message); //定義一個委托,接收消息 private async void SendArgs(string message)
{
if (this.DateListView.InvokeRequired)  //判斷控件是否需要引用 { getMessage d = new getMessage(SendArgs); //聲明一個getMessage委托,該委托指向SendArgs方法。 this.Invoke(d, new object[] { message}); //調用該委托,傳遞參數 } else { MessageBox.Show(message); }
}

子窗體發送消息,一個委托,一個事件sendTo

主窗體接收消息,一個委托

兩個委托都指向主窗體的SendArgs方法

子窗體觸發事件sendTo,即調用sendMessage委托,執行sendArgs方法,sendArgs方法判斷更改控件需要引用來執行,則調用getMessage委托;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM