异步委托的应用(四)代传参数的异步委托
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上给出的例子,我认为对理解这个很有帮助。
在按钮事件中我们不用动,还是原来的代码
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中把每次加的数据都显示出来,看一下这个怎么处理。
下面给出完整的代码
第一节中我说过了。委托就像我们定义一个函数一个,区别就在前面多了一个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"; } } }
相关文章推荐
- 委托(参数传递简单应用示例)
- c# sharp 中委托做参数的一个应用
- 异步委托的应用(一) 没有返回值的应用
- 异步委托的应用(二) 有返回值的应用
- 异步委托的应用(五)文件对比的例子
- 委托与事件的简单应用(不同控件之间的控制及参数传递,C# VB)
- 异步委托的应用(三) 去掉Form.CheckForIllegalCrossThreadCalls = false
- 方法作为参数,委托应用
- WCF 项目应用连载[9] - 契约中的委托 & 事件参数处理
- 关于异步委托的调用与应用场景
- C语言辅导:不定参数在C语言中的应用实例
- 详细教程C#中的委托和事件应用 一
- 自定义泛型方法及其应用和类型参数的类型推断
- 可变参数宏 在VS中的应用
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- ffmpeg应用x264编码, 编码参数解析
- 帮助理解可变参数的应用【转贴】
- Python学习19:其他应用(列表综合、列表或元组作为函数参数、lambda形式)
- 编程回忆之Android回忆(Android应用参数的获取)
- AOP典型应用:自动打印方法参数与返回值