如同java一樣,在c#中寫一個(gè)多線程應(yīng)用是非常簡(jiǎn)單的,本章將介紹如何在c#種開發(fā)多線程程序。在.net中線程是由System.Threading 名字空間所定義的。所以你必須包含這個(gè)名字空間。
using System.Threading;
開始一個(gè)線程
System.Threading 名字空間的線程類描述了一個(gè)線程對(duì)象,通過(guò)使用類對(duì)象,你可以創(chuàng)建、刪除、停止及恢復(fù)一個(gè)線程。創(chuàng)建一個(gè)新線程通過(guò)new 操作,并可以通過(guò)start()方法啟動(dòng)線程
thread = new Thread(new ThreadStart(HelloWorld));
thread.Start();
注意:和java程序不同,創(chuàng)建新線程并調(diào)用start()方法后并不去調(diào)用run()方法,而是傳遞線程調(diào)用程序
下面是啟動(dòng)線程執(zhí)行的函數(shù)
protected void HelloWorld()
{
string str ;
Console.write("helloworld");
}
}
殺死一個(gè)線程
線程類的 Abort()方法可以永久的殺死一個(gè)線程。在殺死一個(gè)線程起前應(yīng)該判斷線程是否在生存期間。
if ( thread.IsAlive )
{
thread.Abort();
}
停止一個(gè)線程
Thread.Sleep 方法能夠在一個(gè)固定周期類停止一個(gè)線程
thread.Sleep();
設(shè)定線程優(yōu)先級(jí)
線程類中的ThreadPriority 屬性是用來(lái)設(shè)定一個(gè)ThreadPriority的優(yōu)先級(jí)別。線程優(yōu)先級(jí)別包括Normal, AboveNormal, BelowNormal, Highest, and Lowest幾種。
thread.Priority = ThreadPriority.Highest;
掛起一個(gè)線程
調(diào)用線程類的Suspend()方法將掛起一個(gè)線程直到使用Resume()方法喚起她。在掛起一個(gè)線程起前應(yīng)該判斷線程是否在活動(dòng)期間。
if (thread.ThreadState == ThreadState.Running )
{
thread.Suspend();
}
喚起一個(gè)線程
通過(guò)使用Resume()方法可以喚起一個(gè)被掛起線程。在掛起一個(gè)線程起前應(yīng)該判斷線程是否在掛起期間,如果
線程未被掛起則方法不起作用。
if (thread.ThreadState == ThreadState.Suspended )
{
thread.Resume();
}
在很多情況下你可能要在各個(gè)線程中分別執(zhí)行存在輕微差別的任務(wù),同時(shí)需要把某種參數(shù)從一種任務(wù)所在的線程傳遞給另一任務(wù)所在的線程。要完成這一目標(biāo)可以采取好幾種合理的方式,最直接的做法就是創(chuàng)建一種Task對(duì)象,由它保存線程、特有的參數(shù)以及提供ThreadStart指派的worker方法。利用worker方法即可讀取所提供的參數(shù),因?yàn)樗镁褪荰ask對(duì)象的成員所以對(duì)線程當(dāng)然是唯一的。通過(guò)令線程成為一種公共字段,你就可以獲得訪問(wèn)線程所有成員的權(quán)限而不必編寫額外的封裝代碼了。請(qǐng)參看程序清單B 閱讀這一技術(shù)的有關(guān)示例。
程序清單B
using System;
using System.Threading;
namespace TaskDemo {
public class MyTask {
public Thread m_thread;
string m_name;
public MyTask(string name) {
m_name = name;
m_thread = new Thread(new ThreadStart(Worker));
}
private void Worker() {
Console.WriteLine("Hello, ");
Thread.Sleep(1500);
Console.WriteLine(m_name);
}
}
class TaskDemo1 {
static void Main(string [] args) {
MyTask task1 = new MyTask("Bill");
MyTask task2 = new MyTask("Steve");
task1.m_thread.Start();
task2.m_thread.Start();
}
}
}
關(guān)閉窗口結(jié)束線程
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if(my_thread.ThreadState.ToString() =="Suspended")
{
my_thread.Resume();
my_thread.Abort();
my_thread.Join();
}
else
{
my_thread.Abort();
my_thread.Join();
}
}
聯(lián)系客服