多线程计算:ThreadPool:Set and Reset

来源:互联网 发布:linux下载jdk1.8 命令 编辑:程序博客网 时间:2024/05/18 03:40

using System;
using System.Threading;
class CalculateTest
{
    static void Main()
    {
        Calculate calc = new Calculate();
        Console.WriteLine("Result = {0}.",
            calc.Result(55).ToString());
        Console.WriteLine("Result = {0}.",
            calc.Result(34).ToString());
        Console.ReadKey();
    }
}
class Calculate
{
    double baseNumber, firstTerm, secondTerm, thirdTerm;
    AutoResetEvent[] autoEvents;
    ManualResetEvent manualEvent;
    Random randomGenerator;
    public Calculate()
    {
        autoEvents = new AutoResetEvent[]
        {
            new AutoResetEvent(false),
            new AutoResetEvent(false),
            new AutoResetEvent(false)
        };
        manualEvent = new ManualResetEvent(false);
    }
    void CalculateBase(object stateInfo)
    {
        baseNumber = randomGenerator.NextDouble();
        manualEvent.Set();
    }
  
    void CalculateFirstTerm(object stateInfo)
    {
        double preCalc = randomGenerator.NextDouble();
        manualEvent.WaitOne();
        firstTerm = preCalc * baseNumber *
            randomGenerator.NextDouble();
        autoEvents[0].Set();
    }
    void CalculateSecondTerm(object stateInfo)
    {
        double preCalc = randomGenerator.NextDouble();
        manualEvent.WaitOne();
        secondTerm = preCalc * baseNumber *
            randomGenerator.NextDouble();
        autoEvents[1].Set();
    }
    void CalculateThirdTerm(object stateInfo)
    {
        double preCalc = randomGenerator.NextDouble();
        manualEvent.WaitOne();
        thirdTerm = preCalc * baseNumber *
            randomGenerator.NextDouble();
        autoEvents[2].Set();
    }
    public double Result(int seed)
    {
        randomGenerator = new Random(seed);

        ThreadPool.QueueUserWorkItem(
            new WaitCallback(CalculateBase));
        ThreadPool.QueueUserWorkItem(
            new WaitCallback(CalculateFirstTerm));
        ThreadPool.QueueUserWorkItem(
            new WaitCallback(CalculateSecondTerm));
        ThreadPool.QueueUserWorkItem(
            new WaitCallback(CalculateThirdTerm));
        WaitHandle.WaitAll(autoEvents);
        manualEvent.Reset();
        return firstTerm + secondTerm + thirdTerm;
    }
}