天天看點

黑馬程式員——線程調用

---------------------- Windows Phone 7手機開發、 .Net教育訓練、期待與您交流! ----------------------

産生一個線程的4個步驟:

1編寫産生線程所要執行的方法

2引用System.Threading命名空間

3執行個體化Thread類,并傳入一個執行線程所要運作的方法的委托(這時候這個線程已經産生,但是還沒有運作)

4調用Thead示例的Start方法,标記該線程可以被CPU執行了,具體執行時間由CPU決定。

前台線程和背景線程(預設線程為前台線程)

前提線程:隻要所有的前台線程都關閉才能完成程式關閉

背景線程:隻要所有的前台線程結束,背景線程自動結束。

為線程建立一個方法

public void CountTime()

{

for (int i = 0; i <= 999999999; i++)

{

}

MessageBox.Show("循環完畢!");

}

using System.Threading;//導入名稱空間

//建立委托

private void btnMulThread_Click(object sender, EventArgs e)

{

//建立線程對象,傳入方法

Thread thread = new Thread(new ThreadStart(CountTime));

thread.IsBackground = true;//設定為背景線程

thread.Start();//還隻執行(由CPU決定)

}

方法重入的問題

//線程調用方法

//改變本文框的值

void ChangeText()

{

for (int i = 0; i < 1000; i++)

{

int a = int.Parse(txtNumber.Text.Trim());

Console.WriteLine(Thread.CurrentThread.Name + ",a=" + a + ",i=" + i.ToString());

a++;

txtNumber.Text = a.ToString();

}

}

//方法重入問題

private void btnPromble_Click(object sender, EventArgs e)

{

//執行個體化線程對象1

Thread thread1 = new Thread(ChangeText);

thread1.IsBackground = true;

thread1.Name = "t1";

thread1.Start();

//執行個體化線程對象2

Thread thread2 = new Thread(ChangeText);

thread2.IsBackground = true;

thread2.Name = "t2";

thread2.Start();

}

發現最後文本框的值是1017,原因是線程間的調用,當t1調用的時候,t2來調用

然後取值相同,重複了一遍。

傳遞帶參數的線程

//帶一個參數的調用線程-----------------------------------------------------------------

//線程調用方法

//顯示文本框的名字

void Display(object name)

{

if (name != null)

MessageBox.Show("name:" + name.ToString());

else

MessageBox.Show("null");

}

//顯示文本框姓名

private void button1_Click(object sender, EventArgs e)

{

Thread thread = new Thread(Display);

thread.Start(txtName.Text.Trim());

}

//帶多個參數的調用線程-----------------------------------------------------------------

//顯示文本框的名字

void Display2(object li)

{

List list = li as List;

if (list != null)

{

foreach (string s in list)

{

MessageBox.Show(s);

}

}

else

{

MessageBox.Show("Null");

}

}

//帶多個參數的調用線程

private void btnMuliParmar_Click(object sender, EventArgs e)

{

Thread thread = new Thread(Display2);

thread.Start(new List { "劉德華", "張傑", "楊幂" });

}

自定義線程類

class MyThread

{

//-----------------------執行不帶參數的方法

ThreadStart ts;

public MyThread(ThreadStart ts)//要求使用者new的時候傳入方法委托

{

this.ts = ts;//将委托指派給全局變量ts

}

public void Start()//調用線程

{

ts();//調用委托執行委托裡面的方法(不帶參數)

}

//-----------------------執行帶參數的方法

ParameterizedThreadStart pts;

public MyThread(ParameterizedThreadStart pts)//要求使用者new的時候傳入方法委托

{

this.pts = pts;//将委托指派給全局變量pts

}

public void Start(object o)//調用線程

{

pts(o);//調用委托執行委托裡面的方法(帶參數)

}

}

---------------------- Windows Phone 7手機開發、 .Net教育訓練、期待與您交流! ----------------------

詳細請檢視: http://net.itheima.com/