委托的异步调用

 public delegate void deleGetUserList(object sdf);//定义一个委托

 deleGetUserList du = new deleGetUserList(GetUserList);
             du.BeginInvoke(AdminId, null, null);

 public void GetUserList(Object str)
        {}

 

 

 

异步调用相当于在主线程中开辟了一个新的线程在后台来执行需要异步调用的方法,在这个方法中如果要操作其他控件(比如将文本框填入某一字符串),就 会抛出一个cross-thread异常,这个异常是由于编译器出于安全考虑,不允许不是创建这个控件的线程来调用这个控件(文本框).解决的方法是:

    在这个另外的一个线程中通过使用这个控件的Invoke(Delegate method,params object[] args)方法,Invoke可以调用一个委托,可以在这个委托所代表的方法中对这个控件进行操作;

    Invoke有2个参数,第一个是要执行操作的方法的代理,第二个是要执行操作的方法需要的参数对象数组.

    下面是一个小例子(在按钮事件新建立的线程中对一个文本框写入"helloworld"字符串):

  delegate void AddMsgDel(string msg);
private void button1_Click(object sender, EventArgs e)
{

Thread thread = new Thread(new ThreadStart(Method));
thread.Start();
}
private void Method() {
AddMsgDel del=new AddMsgDel(AddMsg);
textBox1.Invoke(del, new object[] { "helloworld" });
}
public void AddMsg(string msg) {
this.textBox1.Text = msg;
}
posted on 2013-08-28 13:57  咖啡加点盐  阅读(250)  评论(0编辑  收藏  举报