并行的一些基本用法

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

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;
}

 

posted @ 2017-05-31 14:31  TanSea  阅读(403)  评论(0编辑  收藏  举报