您的位置:首页 > 其它

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

2010-08-23 11:29 288 查看
  还记得上节中我们留下的那个问题吗?就是在记数的时候,我们不是从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上给出的例子,我认为对理解这个很有帮助。

    
public delegate void MyDelegate(Label myControl, string myArg2);
private void Button_Click(object sender, EventArgs e)
{
object[] myArray = new object[2];
myArray[0] = new Label();
myArray[1] = "Enter a Value";
myTextBox.BeginInvoke(new MyDelegate(DelegateMethod), myArray);
}
public void DelegateMethod(Label myControl, string myCaption)
{
myControl.Location = new Point(16,16);
myControl.Size = new Size(80, 25);
myControl.Text = myCaption;
this.Controls.Add(myControl);
}


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

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中把每次加的数据都显示出来,看一下这个怎么处理。

下面给出完整的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.Remoting.Messaging;
namespace TempDelegate1
{
public partial class Form1 : Form
{
//定义一个没有返回值的委托,处了多了一个delegate是不是和定义函数没有什么区别
public delegate void getNums();

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

//代参数的委托(并且代回传值的),主要是用来显示文字的
public delegate void txtGetValue(string str);

public Form1()
{
InitializeComponent();
}
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 = "我正在计数";
}

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

/// <summary>
/// 用来显示txtNums里的值的
/// </summary>
/// <param name="i"></param>
public void txtNums(int i)
{
this.txtNum.Text = (Convert.ToInt32(this.txtNum.Text.Trim()) + i).ToString();
}
/// <summary>
/// 代回调参数并且代传参数的信息显示
/// </summary>
/// <param name="str"></param>
public void txtValue(string str)
{
this.txtInfo.Text += str + "/r/n";
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: