c# windows编程,常会用到多线程,在新开的线程中要对主线程的页面数据进行更改时,需要通过delegate进行委托
public
delegate
void show(string info); //定义一个委托,参数为string
privatevoid 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, newobject[] { info }); //引用该委托,并传递参数
}
else
{
add_info(info); //调用真正的代码逻辑
}
}
在新开线程代码中,直接调用add_info()属于跨线程操作,无法操控主线程内容,调用add_info_event()即可。
扩展:如果主form,生成一个子form,子form要对主form的进行通信,更改内容,也可以使用delegate和event相配合。
子form1:
public
delegate
void sendMessage(string message); //定义一个委托,发送消息
publicevent sendMessage sendTo; //声明一个事件,类型为sendMessage 调用sendTo(string message)向主窗体通信
主form:
Form1 form1=new Form1();
//主窗体的构造方法
public
Form(){
form1.show();
form1.sendTo += new Form1.sendMessage(SendArgs); //将子窗体的sendTo事件类型为sendMessage委托,并将委托与主窗体中的SendArgs方法绑定;
}
publicdelegatevoid getMessage(string message); //定义一个委托,接收消息
privateasyncvoid SendArgs(string message)
{
if (this.DateListView.InvokeRequired) //判断控件是否需要引用
{
getMessage d = new getMessage(SendArgs); //声明一个getMessage委托,该委托指向SendArgs方法。
this.Invoke(d, newobject[] { message}); //调用该委托,传递参数
}
else {
MessageBox.Show(message);
}
}
子窗体发送消息,一个委托,一个事件sendTo
主窗体接收消息,一个委托
两个委托都指向主窗体的SendArgs方法
子窗体触发事件sendTo,即调用sendMessage委托,执行sendArgs方法,sendArgs方法判断更改控件需要引用来执行,则调用getMessage委托;
原文:https://www.cnblogs.com/yhood/p/11526666.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!