asp.net類庫中與線程

來源:互聯網
上載者:User

如何產生一個線程?

建立 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/ 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.