日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

C#中多线程的并行处理

發(fā)布時(shí)間:2024/1/4 综合教程 25 生活家
生活随笔 收集整理的這篇文章主要介紹了 C#中多线程的并行处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

System.Threading.Tasks,在該命名空間下Task是主類(lèi),表示一個(gè)類(lèi)的異步的并發(fā)的操作,創(chuàng)建并行代碼的時(shí)候不一定要直接使用Task類(lèi),在某些情況下可以直接使用Parallel靜態(tài)類(lèi)(System.Threading.Tasks.Parallel)下所提供的方法進(jìn)行并行開(kāi)發(fā),而不用底層的Task實(shí)例。
并行處理無(wú)法保證順序,不需要考慮任務(wù)和線程的問(wèn)題,執(zhí)行效率加快,當(dāng)然也不是絕對(duì)的,任務(wù)的開(kāi)銷(xiāo)大小對(duì)并行任務(wù)有影響,如果任務(wù)很小,那么由于并行管理的附加開(kāi)銷(xiāo)(任務(wù)分配,調(diào)度,同步等成本),可能并行執(zhí)行并不是優(yōu)化方案。例如:循環(huán)打印10000個(gè)數(shù)字,for的循環(huán)比Parallel.For快

Parallel 類(lèi)的使用(System.Threading.Tasks)

提供對(duì)并行循環(huán)和區(qū)域的支持。在Parallel下面有三個(gè)常用的方法invoke,For和ForEach。

Stopwatch stopWatch = new Stopwatch();

List<int> sourceList = new List<int>();
for (int i = 0; i <= 10000; i++)
{
    sourceList.Add(i);
}

stopWatch.Reset();
stopWatch.Start();
List<int> resultList = new List<int>();
foreach (int option in sourceList) {
    Thread.Sleep(1);
    resultList.Add(option);
}
stopWatch.Stop();
Console.WriteLine("正常運(yùn)行:" + stopWatch.ElapsedMilliseconds + " ms.");

stopWatch.Reset();
stopWatch.Start();
ConcurrentBag<int> concurrentBagList = new ConcurrentBag<int>();
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;
Parallel.ForEach(sourceList, options, (item) =>
{
    Thread.Sleep(1);
    concurrentBagList.Add(item);
});
stopWatch.Stop();
Console.WriteLine("并行運(yùn)行:" + stopWatch.ElapsedMilliseconds + " ms.");

上面的例子,如果把Thread.Sleep(1),去掉可以發(fā)現(xiàn),foreach比Parallel.ForEach快,所以任務(wù)的開(kāi)銷(xiāo)很重要。ConcurrentBag如果換成List可以發(fā)現(xiàn),list中的數(shù)據(jù)不夠。List集合,數(shù)組Int[],String[] ……,Dictory字典等等。但是這些列表、集合和數(shù)組的線程都不是安全的,不能接受并發(fā)請(qǐng)求。微軟也提供了線程安全的類(lèi)Concurrent

Concurrent類(lèi)(System.Collections)

命名空間提供多個(gè)線程安全集合類(lèi)。當(dāng)有多個(gè)線程并發(fā)訪問(wèn)集合時(shí),應(yīng)使用這些類(lèi)代替 System.Collections 和 System.Collections.Generic 命名空間中的對(duì)應(yīng)類(lèi)型。

BlockingCollection<T> 為實(shí)現(xiàn) IProducerConsumerCollection<T> 的線程安全集合提供阻塞和限制功能。
ConcurrentBag<T> 表示對(duì)象的線程安全的無(wú)序集合。可以用來(lái)替換List<T>
ConcurrentDictionary<TKey, TValue> 表示可由多個(gè)線程同時(shí)訪問(wèn)的鍵值對(duì)的線程安全集合。Dictionary<TKey, TValue>
ConcurrentQueue<T> 表示線程安全的先進(jìn)先出 (FIFO) 集合。Queue<T>
ConcurrentStack<T> 表示線程安全的后進(jìn)先出 (LIFO) 集合。Stack<T>

NuGet中AsyncEnumerator

并行中的多線程

await list.ParallelForEachAsync(async l =>
            {
.......
            });

其他的多線程文章

1.C#中await/async閑說(shuō)

2..NET中并行開(kāi)發(fā)優(yōu)化

3.C# Task.Run 和 Task.Factory.StartNew 區(qū)別

4.C#中多線程的并行處理

5.C#中多線程中變量研究

總結(jié)

以上是生活随笔為你收集整理的C#中多线程的并行处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。