异步委托的应用(四)代传参数的异步委托

来源:互联网 发布:qq农场捕鱼枪升级数据 编辑:程序博客网 时间:2024/05/15 01:53

  还记得上节中我们留下的那个问题吗?就是在记数的时候,我们不是从1加到10了而中一直在加1,这就与我们的需求不符合了。这怎么呢。我们通过程序可以看到要想做到从1加到10,那么我们必须要把每次循环的的数传进相对应的函数中才行。这要怎么呢。

  第一节中我说过了。委托就像我们定义一个函数一个,区别就在前面多了一个delegate,我们只要在定义它时给他定义一个传值就行了。

  好了,我们在以前的程序上改动一下就行。

 

  第一步,我们要修改一下委托

 

  //代参数的委托,主要用来在计数框中显示值
        public delegate void txtGetNums(int i);

  这里我们定义了一个 int i它就是用来传值的

 

   第二步,修改与委托对应的函数(还记得我说过的吗。每个委托都会有一个与其的函数)

 

        /// <summary>
        /// 用来显示txtNums里的值的
        /// </summary>
        /// <param name="i"></param>
        public void txtNums(int i)
        {
            this.txtNum.Text = (Convert.ToInt32(this.txtNum.Text.Trim()) + i).ToString();
        }

 

   第三步,修改调用此委托的方法

 

    /// <summary>
        /// 无返回值调用方法,用来计数,这里我用了一个Thread.sleep(500)这个大家都应该明白是什么意思,就是让它暂停半秒钟
        /// 只有这样,我们才能看到它的变化。
        /// </summary>
        public void GetNum()
        {
            for (int i = 1; i <= 10; i++)
            {
               
                this.txtNum.BeginInvoke(new txtGetNums(txtNums),i);
                Thread.Sleep(500);
            }
           
        }

 

    注意我用红色标出的部分。BeginInvoke方面第二个参数是一个object[]类型的.作为给定方法的参数传递的对象数组。如果不需要参数,则可以为 空引用

 

       这里要注意一点是什么,这个值是一个数组,它是与委托定义的值是相对应的,因为咱们只定义了一个int i,所以你在这里只要给值一个i就完了。如果你定义了二个怎么办呢。

 

    下面是MSDN上给出的例子,我认为对理解这个很有帮助。

 

    

 

   在按钮事件中我们不用动,还是原来的代码

 

      private void btnAdd_Click(object sender, EventArgs e)
        {
            this.txtInfo.Text = "开始计数";

            //这里初始化一下委托,这里要说明的是,委托中调用的函数不用加()只要一个名字就行了。
            getNums gn = new getNums(GetNum);


            //因为我们没有任何的返回值,所以BeginInvoke里面就是给null
            gn.BeginInvoke(null, null);

            this.txtInfo.Text = "我正在计数";
           
        }

 

      试一下,是不是和我们的要求一样呢。呵呵。。。。。。这里留一个问题,你可以试着,在txtInfo中把每次加的数据都显示出来,看一下这个怎么处理。

      下面给出完整的代码

原创粉丝点击