基礎_C# 線程處理

來源:互聯網
上載者:User
C# 線程處理

內容

  • 使用線程處理

  • 如何:建立和終止線程

  • 如何:使用線程池

  • 如何:對製造者線程和使用者線程進行同步

 

使用線程池

通過 ThreadPool 類使用

下面的樣本使用 .NET Framework 線程池計算 20 和 40 之間的十個數的 Fibonacci 結果。每個 Fibonacci 結果都由 Fibonacci 類表示,該類提供一種名為 ThreadPoolCallback 的方法來執行此計算。將建立表示每個 Fibonacci 值的對象,ThreadPoolCallback 方法將傳遞給 QueueUserWorkItem,它分配池中的一個可用線程來執行此方法。

由於為每個 Fibonacci 對象都提供了一個半隨機值來進行計算,而且十個線程都將競爭處理器時間,因此無法提前知道十個結果全部計算出來所需的時間。因此在構造期間為每個 Fibonacci 對象傳遞 ManualResetEvent 類的一個執行個體。當計算完成時,每個對象都通知提供的事件對象,使主線程用 WaitAll 阻止執行,直到十個 Fibonacci 對象全部計算出了結果。然後 Main 方法將顯示每個 Fibonacci 結果。

using System;using System.Threading;public class Fibonacci{    public Fibonacci(int n, ManualResetEvent doneEvent)    {        _n = n;        _doneEvent = doneEvent;    }    // Wrapper method for use with thread pool.    public void ThreadPoolCallback(Object threadContext)    {        int threadIndex = (int)threadContext;        Console.WriteLine("thread {0} started...", threadIndex);        _fibOfN = Calculate(_n);        Console.WriteLine("thread {0} result calculated...", threadIndex);        _doneEvent.Set();    }    // Recursive method that calculates the Nth Fibonacci number.    public int Calculate(int n)    {        if (n <= 1)        {            return n;        }        return Calculate(n - 1) + Calculate(n - 2);    }    public int N { get { return _n; } }    private int _n;    public int FibOfN { get { return _fibOfN; } }    private int _fibOfN;    private ManualResetEvent _doneEvent;}public class ThreadPoolExample{    static void Main()    {        const int FibonacciCalculations = 10;        // One event is used for each Fibonacci object        ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations];        Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];        Random r = new Random();        // Configure and launch threads using ThreadPool:        Console.WriteLine("launching {0} tasks...", FibonacciCalculations);        for (int i = 0; i < FibonacciCalculations; i++)        {            doneEvents[i] = new ManualResetEvent(false);            Fibonacci f = new Fibonacci(r.Next(20, 40), doneEvents[i]);            fibArray[i] = f;            ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);        }        // Wait for all threads in pool to calculation...        WaitHandle.WaitAll(doneEvents);        Console.WriteLine("All calculations are complete.");        // Display the results...        for (int i = 0; i < FibonacciCalculations; i++)        {            Fibonacci f = fibArray[i];            Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN);        }    }}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.