基础_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#线程处理

C#线程处理 线程处理使 C# 程序能够执行并发处理,以便您可以同时执行多个操作。例如,您可以使用线程处理来监视用户输入,执行后台任务,以及处理并发输入流。System.Threading 命名空间提...
  • husheng0
  • husheng0
  • 2015年07月19日 13:55
  • 991

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

转自:http://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html 引言: 最近一段时间都在研究关于.Net线程的内容,觉得线程是...
  • u012252959
  • u012252959
  • 2016年01月12日 16:55
  • 241

线程处理(C# 编程指南)

线程处理使 C# 程序能够执行并发处理,以便您可以同时执行多个操作。例如,您可以使用线程处理来监视用户输入,执行后台任务,以及处理并发输入流。System.Threading 命名空间提供支持多线程编...
  • my98800
  • my98800
  • 2016年10月03日 08:43
  • 125

一个用来“拉”任务的简单线程池 c#版

通常用到线程池时,会用到“生产者-消费者”模型。如果项目中不好实现“生产者”这一角色,而是预先开好N条线程,然后让线程自己去“拉”任务,“拉”到有任务就处理,然后再“拉”任务,这样实现起来很简单,但任...
  • zouxinke
  • zouxinke
  • 2015年02月10日 21:52
  • 424

C# 线程处理教程

线程处理的优点是可以创建使用多个执行线程的应用程序。例如,某一进程可以具有管理与用户交互的用户界面线程,以及在用户界面线程等待用户输入时执行其他任务的辅助线程。该教程说明各种线程活动: 创建和...
  • lanwilliam
  • lanwilliam
  • 2008年05月09日 10:55
  • 644

C#线程处理基本知识

章节:线程与线程处理讨论多线程的优缺点,并概括了可以创建线程或使用线程池线程的几种情形。托管线程中的异常描述不同版本 .NET Framework 的线程中的未经处理的异常的行为,尤其是导致应用程序终...
  • muzizongheng
  • muzizongheng
  • 2013年07月10日 15:43
  • 515

线程处理

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 17:06
  • 133

异步线程处理bitmap

高效加载大bitmap课程讨论过,当从磁盘或者网络读取数据(或者其他没有在内存的数据)时,不应该在主线程执行BitmapFactory.decode*方法。因为此时加载数据花费的时间是不确定的,依赖于...
  • nuannuandetaiyang
  • nuannuandetaiyang
  • 2016年07月24日 17:20
  • 593

C#-基础加强(1)

1.背景 ,所在的专业是 软件工程net方向,所以在2013年就开始学习C#语言,那时候就会写个小程序,比如贪吃蛇什  么的,后接触了网站,觉得很有趣,就开始加强基础学习。 2.在2014年寒假在...
  • LABLENET
  • LABLENET
  • 2015年08月02日 20:20
  • 559

C# 程序员参考--线程处理教程

线程处理的优点是可以创建使用多个执行线程的应用程序。例如,某一进程可以具有管理与用户交互的用户界面线程,以及在用户界面线程等待用户输入时执行其他任务的辅助线程。该教程说明各种线程活动:创建和执行线程线...
  • shaily
  • shaily
  • 2009年10月19日 12:56
  • 430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基础_C# 线程处理
举报原因:
原因补充:

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