基础_C# 线程处理

原创 2011年01月19日 17:31:00

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);
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[C# 线程处理系列]专题一:线程基础

转自:http://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html 引言: 最近一段时间都在研究关于.Net线程的内容,觉得线程是...

[C# 线程处理系列]专题七:线程同步——信号量和互斥体

也不多说了,直接进入主题了 一、信号量(Semaphore) 信号量(Semaphore)是由内核对象维护的int变量,当信号量为0时,在信号量上等待的线程会堵塞,信号量大于0时,就解除堵...

[C# 线程处理系列]专题二:线程的详细使用

一、上节补充 对于Thread类还有几个常用方法需要说明的。 1.1 Suspend和Resume方法 这两个方法在.net Framework 1.0的时候就支持的方法,他们分别可...

24 C# 第十九章(二) 基于 .Net 4 TPL 的同步和线程处理模式

异步编程模式  (APM: Asynchronous Programming Model) 多线程编程的主要问题: 1)  监视异步操作的状态,知道何时完成。 2)  线程池。避免启动和终止线程的...

[C# 线程处理系列]专题三:线程池中的工作者线程

目录: 一、CLR线程池基础 二、通过线程池的工作者线程实现异步 三、使用委托实现异步 四、任务 一、线程池基础 首先,创建和销毁线程是一个要耗费大量时间的过程...

C#多线程值之APM二:GUI线程处理模式2

上文中讲述了工作者线程将数据同步到GUI中的第一种方式,本文讲述第二种方式: Control.Invoke()与Control.BeginInvoke() // 摘要: ...
  • chifuqi
  • chifuqi
  • 2012年05月11日 16:00
  • 1215

[C# 线程处理系列]专题五:线程同步

目录: 一、线程同步概述 二、线程同步的使用 三 、总结   一、线程同步概述   前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创...

[C# 线程处理系列]专题四:线程池中的I/O线程

上一篇文章主要介绍了如何利用线程池中的工作者线程来实现多线程,使多个线程可以并发地工作,从而高效率地使用系统资源。在这篇文章中将介绍如何用线程池中的I/O线程来执行I/O操作,希望对大家有所帮助。 ...

[C# 线程处理系列]专题六:线程同步——事件构造

引言: 其实这部分内容应该是属于专题四,因为这篇也是讲关于线程同步的,但是由于考虑到用户的阅读习惯问题,因为文章太长了,很多人不是很愿意看包括我也是这样的,同时也有和我说可以把代码弄成折叠的,这...

MFC线程处理概述.doc

  • 2010年03月09日 18:55
  • 13KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基础_C# 线程处理
举报原因:
原因补充:

(最多只允许输入30个字)