我們知道,如果按鈕事件中需要啟動(dòng)線程,但線程所調(diào)用的方法默認(rèn)是不帶參數(shù),不帶返回值的,如果需要調(diào)用的方法我就TNND想帶參數(shù),帶返回值,怎么做?我寫了例子。
界面:

要實(shí)現(xiàn)個(gè)簡單功能,輸入數(shù)字1,數(shù)字2,當(dāng)按sum按鈕時(shí),做一個(gè)從數(shù)字1到數(shù)字2的累加,然后彈出消息框顯示最后結(jié)果。
分析:考慮到軟件實(shí)用,做累加運(yùn)算應(yīng)該單獨(dú)開出一個(gè)線程來做,這個(gè)程序比較簡單,但如果運(yùn)算量很大,點(diǎn)擊按鈕時(shí)程序便會(huì)處于“假死”狀態(tài),動(dòng)不了,(跟360查惡意軟件似的),繼續(xù)分析,如果單獨(dú)開辟線程來做,那線程所調(diào)用的方法必須有兩個(gè)參數(shù)(long num1,long num2),而且需要將結(jié)果返回給主窗體以便彈出窗口顯示結(jié)果,帶參數(shù)比較好解決了,新建一個(gè)類,將兩個(gè)參數(shù)做為類成員,并且在構(gòu)造函數(shù)中接收這兩個(gè)變量,但返回值要如何獲得呢?大多數(shù)人會(huì)舉一反三,參數(shù)既然可以如此,那返回值不也是一個(gè)道理么?設(shè)置第三個(gè)類成員儲(chǔ)存結(jié)果,運(yùn)算完畢后將值賦給這個(gè)變量即可,我們這樣寫這個(gè)類:
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());
}
}
當(dāng)我們真這么做時(shí),發(fā)現(xiàn)這個(gè)結(jié)果一輩子都是0,原因相信大家猜到了,當(dāng)線程啟動(dòng)時(shí),代碼是會(huì)繼續(xù)運(yùn)行的,所以當(dāng)我們?nèi)≈档臅r(shí)候,線程根本尚未開始運(yùn)算,我們?nèi)〉氖亲兞康哪J(rèn)值0,怎么解決這個(gè)問題,這就用到了事件,Num類代碼改進(jìn)如下:
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);//觸發(fā)事件
}
}
這樣我們可以在for循環(huán)結(jié)束后,觸發(fā)事件,并且將結(jié)果返回,相應(yīng)主窗口代碼改進(jìn)如下:
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());
}
}
這樣一來問題就解決了。