时间:2021-05-02
我们知道,如果按钮事件中需要启动线程,但线程所调用的方法默认是不带参数,不带返回值的,如果需要调用的方法我就TNND想带参数,带返回值,怎么做?我写了例子。
要实现个简单功能,输入数字1,数字2,当按sum按钮时,做一个从数字1到数字2的累加,然后弹出消息框显示最后结果。
分析:考虑到软件实用,做累加运算应该单独开出一个线程来做,这个程序比较简单,但如果运算量很大,点击按钮时程序便会处于“假死”状态,动不了,(跟360查恶意软件似的),继续分析,如果单独开辟线程来做,那线程所调用的方法必须有两个参数(long num1,long num2),而且需要将结果返回给主窗体以便弹出窗口显示结果,带参数比较好解决了,新建一个类,将两个参数做为类成员,并且在构造函数中接收这两个变量,但返回值要如何获得呢?大多数人会举一反三,参数既然可以如此,那返回值不也是一个道理么?设置第三个类成员储存结果,运算完毕后将值赋给这个变量即可,我们这样写这个类:
using System;using System.Collections.Generic;using System.Text;
class Num{ private long num1=0; private long num2=0; private long totalSum=0; public Num(long _num1, long _num2) { num1 = _num1; num2 = _num2; } public void sum() { for (long i = num1; i <= num2; i++) { totalSum += i; }
}
}主窗体的代码我们这么写:
public partial class Form1 : Form
{ public Form1() { InitializeComponent(); }
private void btnSum_Click(object sender, EventArgs e) { long num1 = long.Parse(txtNum1.Text); long num2 = long.Parse(txtNum2.Text); Num num = new Num(num1, num2); Thread thread = new Thread(new ThreadStart(num.sum)); thread.Start();
MessageBox.Show(num.totalSum.ToString()); }
}
当我们真这么做时,发现这个结果一辈子都是0,原因相信大家猜到了,当线程启动时,代码是会继续运行的,所以当我们取值的时候,线程根本尚未开始运算,我们取的是变量的默认值0,怎么解决这个问题,这就用到了事件,Num类代码改进如下:using System;using System.Collections.Generic;using System.Text;
public delegate void delegateMe(long total); class Num { private long num1; private long num2; private long totalSum=0; public event delegateMe eventMe; public Num(long _num1, long _num2) { num1 = _num1; num2 = _num2; } public void sum() { for (long i = num1; i <= num2; i++) { totalSum += i; } eventMe(totalSum);//触发事件 }}
这样我们可以在for循环结束后,触发事件,并且将结果返回,相应主窗口代码改进如下:
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;
public partial class Form1 : Form{ public Form1() { InitializeComponent(); }
private void btnSum_Click(object sender, EventArgs e) { long num1 = long.Parse(txtNum1.Text); long num2 = long.Parse(txtNum2.Text); Num num = new Num(num1, num2); num.eventMe += new delegateMe(num_eventMe); Thread thread = new Thread(new ThreadStart(num.sum)); thread.Start(); }
void num_eventMe(long total) { MessageBox.Show(total.ToString()); }}
这样一来问题就解决了。
本文原文地址:http://blog.sina.com.cn/s/blog_4c459776010008ws.html
本文源自:翔宇亭——IT乐园(http://),转载请保留此信息!声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在c#中,event与delegate是两个非常重要的概念。因为在Windows应用程序中,对事件的使用非常频繁,而事件的实现依赖于delegate。下面是对网
C#中的委托委托和事件在.NETFramework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这
在C#的应用程序开发中,我们经常要把UI线程和工作线程分开,防止界面停止响应,同时我们又需要在工作线程中更新UI界面上的控件。但直接访问会出现“线程间操作无效”
相信很多人都了解c#语言,但是对于c#语言编写应用程序的经验不够多,所以经常为没有实例练习而烦恼吧。今天小编给大家介绍下C#里的多线程技术。主要是让大家学会线程
本文实例讲述了C#多线程学习之使用线程池进行多线程的自动管理。分享给大家供大家参考。具体如下:在多线程的程序中,经常会出现两种情况:一种情况:应用程序中,线程把