• 多线程同步控制 ManualResetEvent AutoResetEvent MSDN


    代码
    using System;
    using System.Threading;

    class CalculateTest
    {
        
    static void Main()
        {
            Calculate calc 
    = new Calculate();
            Console.WriteLine(
    "Result = {0}."
                calc.Result(
    234).ToString());
            Console.WriteLine(
    "Result = {0}."
                calc.Result(
    55).ToString());
        }
    }

    class Calculate
    {
        
    double baseNumber, firstTerm, secondTerm, thirdTerm;
        AutoResetEvent[] autoEvents;
        ManualResetEvent manualEvent;

        
    // Generate random numbers to simulate the actual calculations.
        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();

            
    // Signal that baseNumber is ready.
            manualEvent.Set();
        }

        
    // The following CalculateX methods all perform the same
        
    // series of steps as commented in CalculateFirstTerm.

        
    void CalculateFirstTerm(object stateInfo)
        {
            
    // Perform a precalculation.
            double preCalc = randomGenerator.NextDouble();

            
    // Wait for baseNumber to be calculated.
            manualEvent.WaitOne();

            
    // Calculate the first term from preCalc and baseNumber.
            firstTerm = preCalc * baseNumber * 
                randomGenerator.NextDouble();

            
    // Signal that the calculation is finished.
            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);

            
    // Simultaneously calculate the terms.
            ThreadPool.QueueUserWorkItem(
                
    new WaitCallback(CalculateBase));
            ThreadPool.QueueUserWorkItem(
                
    new WaitCallback(CalculateFirstTerm));
            ThreadPool.QueueUserWorkItem(
                
    new WaitCallback(CalculateSecondTerm));
            ThreadPool.QueueUserWorkItem(
                
    new WaitCallback(CalculateThirdTerm));

            
    // Wait for all of the terms to be calculated.
            WaitHandle.WaitAll(autoEvents);

            
    // Reset the wait handle for the next calculation.
            manualEvent.Reset();

            
    return firstTerm + secondTerm + thirdTerm;
        }
    }


  • 相关阅读:
    Linux学习(一)-安装vm虚拟机以及如何在虚拟机上安装Centos系统
    HTML DOM总结
    如何在eclipse中安装angularjs插件
    wfp(Application的运用)
    wpf(第一章 基础知识)
    二叉搜索树的深度&广度优先遍历 C++实现
    Python 实现公式图像识别转 Latex(Mathpix)
    机器学习基石 之 逻辑回归(Logistic Regression)
    机器学习技法 之 聚合模型(Aggregation Model)
    机器学习技法 之 决策树(Decision Tree)
  • 原文地址:https://www.cnblogs.com/shineqiujuan/p/1933374.html
Copyright © 2020-2023  润新知