关键是:
委托定义,委托对象,委托内容
实际上,这个过程是有一种职业人叫做XX代理人,他就是一个XX代理人,我让他代理的具体过程是什么。
我通过一个地产项目的案例来了解winform多线程异步操作是怎么回事情。
有一个地产项目。需要建筑工程师干活,项目督导进行跟踪,还需要国家建筑监管人员做质量鉴定。
建筑师和项目督导的职位可以公司内部定义,但是做质量鉴定的必须是国家人员。
这个项目需要一个建筑队工程师,这个地产公司规定内部职业编号(UpdateControl),这个职位请的人叫CarlUpdateControlLeader,这个职位的这个人在项目还没具体开始就有了
全局的UpdateControl CarlUpdateControlLeader;
//地产公司的建筑队职位。
public delegate void UpdateControl(object objarr, object obj2);
//这个职位聘请的人。
UpdateControl CarlUpdateControlLeader;
//这个人做的具体工作。
private void UpdateControl_Method(object objarr, object obj2)
{
//if (objarr.Length < 2) { return; }
Label lbl = (Label)(objarr);
lbl.Text = obj2.ToString();
}
需要一个内部的协调跟踪人员,实际上他控制整个项目的进度(耗时),这个职位是地产公司内部规定的,职业编号dl_DoAsync,
//地产公司督导职位的定义
delegate string dl_DoAsync(int a, int b);
还需要一个项目的验收人员,这个人必须是国家人员AsyncCallback ,规定死了。
项目开始老板要做的就是分配活儿,告诉大家该干嘛。
private void BossCommand()
{
try
{
//建筑工程师CarlUpdateControlLeader,你去做UpdateControl_Method这个事情
//更新UI的委托
CarlUpdateControlLeader = new UpdateControl(UpdateControl_Method);
//项目督导dl_doThings,我新任命你是让你做DoAsync这个事情。dl_doThings应该知道他需要去和CarlUpdateControlLeader沟通,但是老板没有说,因为这是common sense.
//需要做异步操作的任务代码执行体
dl_DoAsync dl_doThings = new dl_DoAsync(DoAsync);
//我请了个国家机关的AsyncCallback,他叫callbak,他会做收尾工作,具体是MyCallBackMethod。
//异步完成后的回调函数
AsyncCallback callbak = new AsyncCallback(MyCallBackMethod);
//项目督导dl_doThings,注意项目结束后需要跟那个callbak沟通,你自己去。
//好了,你开始干活吧。
//OK ,让我们开始异步吧
dl_doThings.BeginInvoke(0, 0, callbak, dl_doThings);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
项目督导dl_doThings开始工作了。他的工作内容是
//项目督导dl_doThings的具体工作内容。
private string DoAsync(int a, int b)
{
for (int i = 0; i < 100; i++)
{
a++;
b++;
//dl_doThings要把 label2装修一下,让CarlUpdateControlLeader去做,装修成b的样子。
label2.BeginInvoke(CarlUpdateControlLeader, new object[] { label2, b });
//装修一次让他休息一下。
Thread.Sleep(1);
}
//项目完了,有了个结果
return a.ToString() + " -- " + b.ToString();
}
//项目结束了,该那个国家人员callbak干活了。项目督导dl_doThings不能随便去找他,需要包装成国家认证人员的样子嘛IAsyncResult。
private void MyCallBackMethod(IAsyncResult ar)
{
//callbak说你怎么可以跟我一样是国家人员呢,来,脱掉小马甲
dl_DoAsync dl_do = (dl_DoAsync)ar.AsyncState;
//乖,告诉我你什么结果。
string vlu = dl_do.EndInvoke(ar);
//恩,看看基本数据达到要求了没。
if(vlu.IndexOf("100")>-1)
{
//好吧,过关了。
MessageBox.Show("OK, CallBackMedthod Do This");
}
}
额。。。我还是厚道一点,把人家的代码传上来吧,真的不记得是从哪里找来的了。反正不是我写的。