找回密码
 注册
搜索
热搜: 回贴

C#中事件与线程的应用【 烈·翼·焚·天 】

2010-1-31 07:56| 发布者: admin| 查看: 42| 评论: 0|原作者: 青鸾峰

我们知道,如果按钮事件中需要启动线程,但线程所调用的方法默认是不带参数,不带返回值的,如果需要调用的方法我就TNND想带参数,带返回值,怎么做?忽悠男上课讲了,噼里啪啦代码一敲,全然不管众人听懂与否,我又写了遍,例子虽然简单,但是很基本。 TNND想带参数,带返回值,怎么做?忽悠
界面:
nbsp; 我们知道,如果按钮事件中需要
要实现个简单功能,输入数字1,数字2,当按sum按钮时,做一个从数字1到数字2的累加,然后弹出消息框显示最后结果。
分析:考虑到软件实用,做累加运算应该单独开出一个线程来做,这个程序比较简单,但如果运算量很大,点击按钮时程序便会处于“假死”状态,动不了,(跟 360查恶意软件似的),继续分析,如果单独开辟线程来做,那线程所调用的方法必须有两个参数(long num1,long num2),而且需要将结果返回给主窗体以便弹出窗口显示结果,带参数比较好解决了,新建一个类,将两个参数做为类成员,并且在构造函数中接收这两个变 量,但返回值要如何获得呢?大多数人会举一反三,参数既然可以如此,那返回值不也是一个道理么?设置第三个类成员储存结果,运算完毕后将值赋给这个变量即 可,我们这样写这个类:
数,不带返回值的,如果需要调用的方法我就
using System;TNND想带参数,带返回值,怎么做?忽悠
using System.Collections.Generic;
using System.Text;
启动线程,但线程所调用的方法默认是不带参
class Num &
{
private long num1=0;
private long num2=0;TNND想带参数,带返回值,怎么做?忽悠
private long totalSum=0;
public Num(long _num1, long _num2)
{nbsp; 我们知道,如果按钮事件中需要
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());TNND想带参数,带返回值,怎么做?忽悠
}
}
TNND想带参数,带返回值,怎么做?忽悠
当我们真这么做时,发现这个结果一辈子都是0,原因相信大家猜到了,当线程启动时,代码是会继续运行的,所以当我们取值的时候,线程根本尚未开始运算,我们取的是变量的默认值0,怎么解决这个问题,这就用到了事件,Num类代码改进如下:
数,不带返回值的,如果需要调用的方法我就using System;
using System.Collections.Generic;
using System.Text;启动线程,但线程所调用的方法默认是不带参

数,不带返回值的,如果需要调用的方法我就
public delegate void delegateMe(long total); &
class Num
{
private long num1;nbsp; 我们知道,如果按钮事件中需要
private long num2;
private long totalSum=0;
public event delegateMe eventMe;TNND想带参数,带返回值,怎么做?忽悠
public Num(long _num1, long _num2)
{
num1 = _num1; &
num2 = _num2;
}
public void sum()TNND想带参数,带返回值,怎么做?忽悠
{
for (long i = num1; i <= num2; i++)
{nbsp; 我们知道,如果按钮事件中需要
totalSum += i;
}
eventMe(totalSum);//触发事件nbsp; 我们知道,如果按钮事件中需要
}
}
& 这样我们可以在for循环结束后,触发事件,并且将结果返回,相应主窗口代码改进如下:
TNND想带参数,带返回值,怎么做?忽悠using System;
using System.Collections.Generic;TNND想带参数,带返回值,怎么做?忽悠
using System.ComponentModel;
using System.Data;
using System.Drawing;nbsp; 我们知道,如果按钮事件中需要
using System.Text;
using System.Windows.Forms;
using System.Threading;
nbsp; 我们知道,如果按钮事件中需要

TNND想带参数,带返回值,怎么做?忽悠public partial class Form1 : Form
{
public Form1()数,不带返回值的,如果需要调用的方法我就
{
InitializeComponent();
}
&
private void btnSum_Click(object sender, EventArgs e)
{nbsp; 我们知道,如果按钮事件中需要
long num1 = long.Parse(txtNum1.Text);
long num2 = long.Parse(txtNum2.Text);
Num num = new Num(num1, num2);TNND想带参数,带返回值,怎么做?忽悠
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());nbsp; 我们知道,如果按钮事件中需要
}
}
nbsp; 我们知道,如果按钮事件中需要 这样一来问题就解决了。
TNND想带参数,带返回值,怎么做?忽悠

最新评论

相关分类

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 07:15 , Processed in 0.145615 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部