并行的一些基本用法,非教程类,备忘用的。
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; }