您的位置:首页 > 其它

Delegate.BeginInvoke例子

2010-04-09 13:19 260 查看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CallBackTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

//要进行异步的方法
private string MethodName(int num, out int ret)
{
ret = num;
return "HelloWorld";
}

//定义与方法同签名的委托
private delegate string DelegateName(int num, out int ret);

//回调方法(异步完成时,执行的方法,此方法只有IAsyncResult一个参数,但是该参数几乎万能,可以传递Object)
private void CallBackMethod(IAsyncResult ar)
{
DelegateName dn = (DelegateName)ar.AsyncState;

int i;

string r = dn.EndInvoke(out i, ar);//一定要EndInvoke,否则你的下场很惨
MessageBox.Show("异步完成了!i的值是"+i.ToString()+",r的值是"+r);
}

private void Form1_Load(object sender, EventArgs e)
{
//实例化委托并初赋值
DelegateName dn = new DelegateName(MethodName);
int i;
//实例化回调函数,把AsyncCallback看成是Delegate就懂了,实际上AsyncCallback是一种特殊的Delegate
AsyncCallback acb = new AsyncCallback(CallBackMethod);
//异步开始
//如果参数acb换成null则表示没有回调方法
//最后一个参数dn的地方,可以换成任意对象,该对象可以被回调方法从参数中获取出来,写成null也可以。
//参数dn相当于该线程的ID,如果有多个异步线程,可以都是null,但是绝对不能一样,不能是同一个object,否则异常
IAsyncResult iar = dn.BeginInvoke(1, out i, acb, dn);
}
}
}


运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: