殡仪馆做网站的好处,o2o电子商务网站开发与运营,注册商标有什么好处和坏处,做网站太累1.并行集合 1.并行集合
a.在C#中, 并行集合(Concurrent Collections)是.NET 为多线程/并行编程设计的线程安全集合b.位于System.Collections.Concurrent命名空间, 专门解决普通集合(如ListT、DictionaryTKey, TValue)在多线程读写时的线程安全问题(普通集合非…1.并行集合1.并行集合a.在C#中,并行集合(ConcurrentCollections)是.NET 为多线程/并行编程设计的线程安全集合 b.位于System.Collections.Concurrent命名空间,专门解决普通集合(如ListT、DictionaryTKey,TValue)在多线程 读写时的线程安全问题(普通集合非线程安全多线程操作会导致数据错乱)1).ConcurrentDictionaryTKey,TValue(最常用)a.线程安全的字典,是多线程场景下Dictionary的直接替代,核心优势是原子操作方法 b.避免手动加锁实现检查 - 添加,更新等复合操作usingSystem;usingSystem.Collections.Concurrent;usingSystem.Threading.Tasks;classConcurrentDictDemo{staticvoidMain(){// 初始化并发字典varconcurrentDictnewConcurrentDictionaryint,string();// 并行循环多线程添加元素Parallel.For(0,100,i{// 原子操作不存在则添加存在则返回已有值concurrentDict.GetOrAdd(i,$Value_{i});// 原子操作尝试更新只有当前值匹配时才更新concurrentDict.TryUpdate(i,$Updated_{i},$Value_{i});});// 多线程查询Parallel.For(0,100,i{if(concurrentDict.TryGetValue(i,outvarvalue)){Console.WriteLine($Key:{i}, Value:{value});}});}}2).ConcurrentQueueT线程安全的FIFO队列,适合生产者线程添加任务消费者线程处理任务的场景(如后台任务池)usingSystem;usingSystem.Collections.Concurrent;usingSystem.Threading;usingSystem.Threading.Tasks;classConcurrentQueueDemo{staticvoidMain(){varqueuenewConcurrentQueueint();varctsnewCancellationTokenSource();// 生产者线程持续添加数据TaskproducerTask.Run((){inti0;while(!cts.Token.IsCancellationRequested){queue.Enqueue(i);Console.WriteLine($生产{i-1});Thread.Sleep(100);}});// 消费者线程持续消费数据TaskconsumerTask.Run((){while(!cts.Token.IsCancellationRequested){if(queue.TryDequeue(outintvalue)){Console.WriteLine($消费{value});}Thread.Sleep(150);}});// 运行5秒后停止Thread.Sleep(5000);cts.Cancel();Task.WaitAll(producer,consumer);}}3).BlockingCollectionT(增强版生产者-消费者)封装了ConcurrentQueue/ConcurrentBag等底层集合,提供阻塞操作(无数据时消费者阻塞, 队列满时生产者阻塞)和边界 限制(限制集合最大容量),是生产者-消费者场景的一站式解决方案usingSystem;usingSystem.Collections.Concurrent;usingSystem.Threading;usingSystem.Threading.Tasks;classBlockingCollectionDemo{staticvoidMain(){// 初始化底层用ConcurrentQueue最大容量10varblockingCollectionnewBlockingCollectionint(newConcurrentQueueint(),10);varctsnewCancellationTokenSource();// 生产者2个线程Parallel.For(0,2,producerId{inti0;while(!cts.Token.IsCancellationRequested){intvalueproducerId*1000i;// 队列满时会阻塞直到有空间blockingCollection.Add(value,cts.Token);Console.WriteLine($生产者{producerId}添加{value});Thread.Sleep(200);}});// 消费者3个线程Parallel.For(0,3,consumerId{try{// 无数据时阻塞直到有数据或完成添加foreach(varvalueinblockingCollection.GetConsumingEnumerable(cts.Token)){Console.WriteLine($消费者{consumerId}处理{value});Thread.Sleep(300);}}catch(OperationCanceledException){Console.WriteLine($消费者{consumerId}停止);}});// 运行10秒后停止Thread.Sleep(10000);cts.Cancel();blockingCollection.CompleteAdding();// 标记“添加完成”消费者遍历结束}}