zoukankan      html  css  js  c++  java
  • 并行的一些基本用法

    并行的一些基本用法,非教程类,备忘用的。

    private ConcurrentBag<string> _bag = new ConcurrentBag<string>();  //多线程无序集合
    private ConcurrentDictionary<int, string> _dictionary = new ConcurrentDictionary<int, string>();  //多线程键值对集合
    private ConcurrentQueue<string> _queue = new ConcurrentQueue<string>();  //多线程队列
    private ConcurrentStack<string> _stack = new ConcurrentStack<string>();  //多线程堆栈
    private Barrier _barrier = null;  //屏障同步 多任务多阶段协同工作
    private SpinLock _spinLock = new SpinLock(false);  //自旋锁
    private CountdownEvent _ce = new CountdownEvent(Environment.ProcessorCount);
    private SemaphoreSlim _ss = new SemaphoreSlim(Environment.ProcessorCount, 50);
    private ManualResetEventSlim _mres = new ManualResetEventSlim(false);
    private object _object = new object();
    public void Example()
    {
        Parallel.Invoke(Example1, Example2, Example3, Example4);  //并行执行N个方法,执行顺序是随机的,由CPU决定
        Parallel.For(1, 100, (index, loopState) => 
        { 
            Console.WriteLine("并行执行第{0}次", index);
            if (index > 30)
                loopState.Stop();  //立即中止循环
        });   //并行执行For循环
        List<Product> products = GetProducts();
        Parallel.ForEach(products, (model, loopState) => 
        {
            Console.WriteLine(model.Name);
            if (model.SellPrice > 60)
                loopState.Break();  //执行完当前迭代后再中止循环
        });   //并行执行ForEach循环
    
        CancellationTokenSource cts = new CancellationTokenSource();  
        Task task = new Task(() =>
        {
            SpinWait.SpinUntil(() => false, 2000);  //自旋2秒(不释放CPU资源等待2秒)
        }, cts);  //新建任务并添加任务取消参数
        task.Status.ToString();  //获取当前任务的状态
        task.Start();  //开启任务
        cts.Cancel();  //通知任务取消,任务取消并不是立即的,有一点的延迟
        Task.WaitAll(new Task[] { task }, 2000);  //等待任务全部结束或超时2秒
        Task<string> taskResult = Task<string>.Factory.StartNew(() => "TanSea");  //任务带泛型参数来接收返回值
        Task.WaitAll(taskResult);
        taskResult.Result.ToString();  //使用Result来获取任务结束后的返回值
        Task continueTask = taskResult.ContinueWith(t => Console.WriteLine(t.Result.ToString()));  //等待任务taskResult结束后执行continueTask任务
    
        _barrier = new Barrier(Environment.ProcessorCount, b => Console.WriteLine(b.CurrentPhaseNumber));
        _barrier.SignalAndWait();  //所有任务到达屏障后继续
        int number = _barrier.ParticipantsRemaining;  //获取还未到达屏障的任务数量
        bool lockTaken = false;
        _spinLock.Enter(ref lockTaken);  //获取锁
        _spinLock.Exit(false);  //释放锁
        _ce.Signal();  //注册信号量
        _ce.Wait();  //等待所有任务完成
        _ce.Reset();  //重置信号量
        _ss.Wait();  //使用信号量
        _ss.Release();  //释放信号量
        _ss.Release(10);  //释放10个信号量
        _mres.Wait();  //等待直到设置为可用
        _mres.Set();  //设置为可用
        _mres.Reset();  //设置为不可用
    }
    private void Example1()
    {
        Console.WriteLine("我是方法1");
    }
    private void Example2()
    {
        Console.WriteLine("我是方法2");
    }
    private void Example3()
    {
        Console.WriteLine("我是方法3");
    }
    private void Example4()
    {
        Console.WriteLine("我是方法4");
    }
    private List<Product> GetProducts()
    {
        List<Product> result = new List<Product>();
        for (int index = 1; index < 100; index++)
        {
            Product model = new Product();
            model.Category = "Category" + index;
            model.Name = "Name" + index;
            model.SellPrice = index;
            result.Add(model);
        }
        return result;
    }
  • 相关阅读:
    jQuery弹出层插件大全:
    JavaScript数组去重的几种方法
    sql去除重复列(行)
    VS无法启动调试
    .将DayOfWeek转换成中文的几种方式
    关于 uniqueidentifier
    链接服务器
    我的目标:系统架构师
    异常(1)
    Visual C++开发工具与调试技巧整理
  • 原文地址:https://www.cnblogs.com/TanSea/p/Parallel.html
Copyright © 2011-2022 走看看