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

来源:互联网 发布:python unittest 编辑:程序博客网 时间:2024/05/04 18:02

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

我想上篇中大家都看到了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中有了相应的结果