我們知道,如果按鈕事件中需要啟動線程,但線程所調用的方法默認是不帶參數,不帶返回值的,如果需要調用的方法我就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());
}
}
這樣一來問題就解決了。