委托的异步调用

隐身守侯 提交于 2020-01-24 00:46:11

 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;        }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!