您的位置:首页 > 其它

异步委托的应用(二) 有返回值的应用

2010-08-19 17:31 253 查看
上一次我们已经简单的了解了在没有返回值的情况下使用异步委托,可是有时候,我们在异步运行完之后,要给出一个结果性的东西,这怎么办呢。这就要用到返回值了。

我想上篇中大家都看到了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中有了相应的结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: