如何產生一個線程?
建立 System.Threading.Thread 對象的一個執行個體,把將要在新線程中執行的 ThreadStart 樣本傳遞給它。例如:
class MyThread
{
public MyThread( string initData )
{
m_data = initData;
m_thread = new Thread( new ThreadStart(ThreadMain) );
m_thread.Start();
}
// ThreadMain() is executed on the new thread.
private void ThreadMain()
{
Console.WriteLine( m_data );
}
public void WaitUntilFinished()
{
m_thread.Join();
}
private Thread m_thread;
private string m_data;
}
這裡建立 MyThread 的一個執行個體就足以產生線程並執行 MyThread.ThreadMain () 方法:
MyThread t = new MyThread( "Hello, world." );
t.WaitUntilFinished();
--------------------------------------------------------------------------------
如何停止一個線程?
有好幾個辦法。首先,你能使用自己的通訊機制告訴 ThreadStart 方法結束。另外 Thread 類有內建的支援來命令線程停止。基本的兩個方法是 Thread.Interrupt () 和 Thread.Abort ()。前者導致拋出一個 ThreadInterruptedException 並隨後進入 WaitJoinSleep 狀態。換句話說,Thread.Interrupt 是一種禮貌的方式,它請求線程在不再進行任何有用的工作時自行停止的。與此相對應,Thread.Abort () 拋出一個 ThreadAbortException 而不管線程正在做什麼。而且,ThreadAbortException 不能像通常的異常那樣被捕獲 (即使最終將執行 ThreadStart 的終止方法)。Thread.Abort () 是一般情況下不需要的非常手段。
--------------------------------------------------------------------------------
怎樣使用線程池?
class CApp
{
static void Main()
{
string s = "Hello, World";
ThreadPool.QueueUserWorkItem( new WaitCallback( DoWork ), s );
Thread.Sleep( 1000 ); // Give time for work item to be executed
}
// DoWork is executed on a thread from the thread pool.
static void DoWork( object state )
{
Console.WriteLine( state );
}
}
--------------------------------------------------------------------------------
怎樣知道我的線程池工作項目是在何時完成的?
沒有方法詢問線程池這類資訊。你必須在 WaitCallback 方法中放置代碼來發出訊號以表明它已經完成。這裡事件也很有用處。
11.5.6 怎樣防止對資料的並發訪問?
每個對象有一個與之相聯的並發鎖 (受批評的部分)。System.Threading.Monitor.Enter/Exit 方法用來獲得和釋放鎖。例如,下面類的執行個體只允許一個線程同時進入方法 f ():
class C
{
public void f()
{
try
{
Monitor.Enter(this);
...
}
finally
{
Monitor.Exit(this);
}
}
}
C# 有一個關鍵字‘lock’提供了以上代碼的簡單形式:
class C
{
public void f()
{
lock(this)
{
...
}
}
}
注意,調用 Monitor.Enter (myObject) 並不意味著對 myObject 的所有訪問都被序列化了。它意味著請求同 myObject 相聯的同步鎖,並且在調用 Monitor.Exit(o) 之前,沒有任何其它線程可以請求該鎖。換句話說,下面的類和以上給出的類在功能上是等同的:
class C
{
public void f()
{
lock( m_object )
{
...
}
}
private m_object = new object();
}
文章來源(WEB開發技術知識庫):http://cn-web.com/cnweb/0/190/article/