异步委托的应用(二) 有返回值的应用
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中有了相应的结果
我想上篇中大家都看到了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中有了相应的结果
相关文章推荐
- 异步委托的应用(四)代传参数的异步委托
- C# 多线程传参和返回值委托异步回调实例
- C#委托—GetInvocationList()的应用(获得多个返回值与异常处理)
- 异步委托的应用(五)文件对比的例子
- 异步委托 多线程 多线程等待 多线程获取返回值
- 异步与同步委托,委托返回值
- 关于异步委托的调用与应用场景
- 异步委托的应用(一) 没有返回值的应用
- 异步委托的应用(三) 去掉Form.CheckForIllegalCrossThreadCalls = false
- C# 委托应用总结
- 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O
- 异步委托设计模式
- 一个关于委托、事件、多线程、异步的Demo
- 方法作为参数,委托应用
- Ajax异步上传在SSM框架中的应用
- 为Windows应用创建简单的异步调用模式
- 异步委托实现多线程winform控件编程
- C# 委托应用总结
- 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
- 关于ASP.net - Joyrock:异步应用示例、JSON-RPC了解