上一次我们已经简单的了解了在没有返回值的情况下使用异步委托,可是有时候,我们在异步运行完之后,要给出一个结果性的东西,这怎么办呢。这就要用到返回值了。
我想上篇中大家都看到了BeginInvoke这个方法。细心的朋友,就会想了。有了开始begin是不是应该有一个结束end啊。对,是有一个结束,这个结束就是用来返回值的。还是上篇中的例子,我们来改一下。看会有什么结果。为了不与上篇冲突,我新定义一个委托和一个方法。
//这次定义一个返回int型的委托
public delegate int getNumValue();
//这个函数与委托相对应
//这里呢。我又加了一个让你所加的值在txtInfo中进行显示
public int valueNum()
{
int j = 0;
for (int i = 1; i <= 10; i++)
{
j += i;
this.txtNum.Text = (Convert.ToInt32(this.txtNum.Text.Trim()) + i).ToString();
//这个就是在txtInfo中显示所加的值的
this.txtInfo.Text += i.ToString() + "/r/n";
Thread.Sleep(500);
}
return j;
}
下面我们来看一下,在点击按钮里,有了些什么变化
private void btnAdd_Click(object sender, EventArgs e)
{
this.txtInfo.Text = "开始计数";
getNumValue gnv = new getNumValue(valueNum);
//这里我们看,我们加入一个回调方法,里面调用了一个函数,这个其实也是一个委托new AsyncCallback,这里我们给object一个数值型的10,它最后在什么地方显示,我们一会就知道了。
gnv.BeginInvoke(new AsyncCallback(CallBackinfo), 10);
this.txtInfo.Text = "我在做别的事情哦";
}
下面我们来看一下回调函数
public void CallBackinfo(IAsyncResult ar)
{
//这里我们就把刚才BeginInvoke中的第二个参数object类型的10取出来了
int GetNum = (int)ar.AsyncState;
//这里要说明的一点的是,因为我们要进行EndInvoke接收的是一个委托方法的接收值,我们就得知道是哪个委拖的值
//而IAsyncResult是没有AsyncDelegate方面的,因为IAsyncResult是一个接口,这时候我们就要把它强制转化为AsyncResult,AsyncResult是一个方法,它是有AsyncDelegate方法的
AsyncResult a = (AsyncResult)ar;
//转化一下
getNumValue gnvs = (getNumValue)a.AsyncDelegate;
//这里我们得到返回的值,这个值是什么,就要大家猜一下了。
int Sums = (int)gnvs.EndInvoke(ar);
this.txtInfo.Text = "计数结束,结果为:" + Sums + "是" + GetNum + "个数相加";
}
运行一下,看一下结果,是不是在txtInfo中有了相应的结果