一般每個(gè)線程都具有固定的任務(wù),。 有時(shí)候在一個(gè)系統(tǒng)中,,多個(gè)任務(wù)只有一點(diǎn)點(diǎn)的區(qū)別,,比如任務(wù)1每秒打印一句“hello tom”,任務(wù)2每秒打印一個(gè)“hello jerry”,,這種情況下完全沒(méi)有必要寫(xiě)兩個(gè)static函數(shù)(占用內(nèi)存),,而且如果以后還有cherry、nancy等人的問(wèn)候語(yǔ),,這個(gè)時(shí)候就需要用到函數(shù)參數(shù)傳遞了,。
csharp中的直接參數(shù)傳遞實(shí)際很容易,但是只能傳遞一個(gè)參數(shù),。 先定一個(gè)線程函數(shù):
static void ThreadMethod(object obj)
{
if (obj != null)
{
string str = obj as string;
while (true)
{
Console.Write("hello " + str + "\r\n");
Thread.Sleep(1000);
}
}
}
傳入?yún)?shù)類型必須是object類型,, Object類是一個(gè)特殊的類,是所有類的父類,如果一個(gè)類沒(méi)有用extends明確指出繼承于某個(gè)類,那么它默認(rèn)繼承Object類。 所以對(duì)于線程來(lái)說(shuō),,不管你傳進(jìn)來(lái)是什么類型,,反正我里面都先把你當(dāng)作obj類型來(lái)接收,如果你說(shuō)你是string類型,?那好的,,我就把你當(dāng)作是string類型:
string str = obj as string;
這樣就完成了變量的接收了。 參數(shù)的傳遞操作也很簡(jiǎn)單:
string a = "tom ";
Thread th = new Thread(ThreadMethod); //創(chuàng)建線程
th.Start(a); //啟動(dòng)線程
這樣就可以完成參數(shù)的傳遞了,。 我們看下面一個(gè)程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace test
{
class Program
{
static void ThreadMethod(object obj)
{
if (obj != null)
{
string str = obj as string;
while (true)
{
Console.Write("hello " + str + "\r\n");
Thread.Sleep(1000);
}
}
}
static void Main(string[] args)
{
string a = "tom ";
int b = 2;
Thread th = new Thread(ThreadMethod); //創(chuàng)建線程
Thread th2 = new Thread(ThreadMethod);
th.Start(a); //啟動(dòng)線程
th2.Start(b);
Console.Write("main start\r\n");
for (int i = 0; i < 10; i++)
{
Console.Write(i + "\r\n");
Thread.Sleep(1000);
}
Console.Write("main end\r\n");
th.Abort();
th2.Abort();
Console.ReadKey();
}
}
}
上面的代碼中,,線程調(diào)用了兩次,控制臺(tái)應(yīng)該可以看到“hello tom”和“hello 2”,,發(fā)現(xiàn)2好像并沒(méi)有傳進(jìn)來(lái),。 嘗試把string改成int,爆出了int不具備null的錯(cuò)誤,,所以這里只能穿具有null屬性的變量類型,,如obj,、string,當(dāng)然還有class,。 對(duì)于多個(gè)參數(shù)傳遞,,可以定義一個(gè)class,其中的成員函數(shù)包含我們所需要的所有參數(shù),,這樣雖然名義上只傳遞了一個(gè)class變量,實(shí)際已經(jīng)完成了多變量傳遞,。
|