亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

[.net 面向對象程序設計進階] (18) 多線程(Multithreading)(三) 利用多線程提高程序性能(下)

2019-11-17 02:13:03
字體:
來源:轉載
供稿:網友

[.net 面向對象程序設計進階] (18) 多線程(Multithreading)(三) 利用多線程提高程序性能(下)

[.net面向對象程序設計進階](18)多線程(Multithreading)(二) 利用多線程提高程序性能(下)

本節導讀:

上節說了線程同步中使用線程鎖和線程通知的方式來處理資源共享問題,這些是多線程的基本原理。

.NET4.0以后對多線程的實現變得更簡單了。

本節主要討論.NET4.0多線程的新特性——使用Task類創建多線程。

讀前必備:

A. LINQ使用 [.net 面向對象編程基礎] (20) LINQ使用

B. 泛型 [.net 面向對象編程基礎] (18) 泛型

1.線程池ThreadPool

在介紹4.0以后的多線程新特征之前,先簡單說一下線程池。

通過前面對多線程的學習,我們發現多線程的創建和使用并不難,難的在于多線程的管理,特別是線程數量級很多的情況下,如何進行管理和資源釋放。需要使用線程池來解決。

簡單來說線程池就是.NET提供的存放線程的一個對象容器。

線程池線程分為兩類:工作線程和IO線程.線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。

對于線程池,可使用要運行的過程的委托調用System.Threading.ThreadPool.QueueUserWorkItem(System.Threading.WaitCallback)方法

下面是一個線程池的示例:

先設置一個創建線程總數靜態字段:

 static readonly int totalThreads = 20;

使用線程池創建線程:

//設置最小線程和最大線程數ThreadPool.SetMinThreads(2, 2);ThreadPool.SetMaxThreads(20, 20);for (int i = 0; i < totalThreads; i++){    ThreadPool.QueueUserWorkItem(o =>    {        Thread.Sleep(1000);        int a, b;        ThreadPool.GetAvailableThreads(out a, out b);        Console.WriteLine(string.Format("({0}/{1}) #{2} : {3}", a, b, Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString()));    });}Console.WriteLine("主線程完成");

運行結果如下:

2.Task類

用ThreadPool的QueueUserWorkItem()方法發起一次異步的線程執行很簡單,但是該方法最大的問題是沒有一個內建的機制讓你知道操作什么時候完成,有沒有一個內建的機制在操作完成后獲得一個返回值。為此,在.NET4.0以后,我們可以使用System.Threading.Tasks中的Task類。這也是.NET4.0以后多線程的推薦做法。

構造一個Task<T>對象,并為泛型T參數傳遞一個操作的返回類型。

Task類可以使用多種方法創建多線程,下面詳細介紹。

2.1使用Factory屬性

Task實例可以用各種不同的方式創建。最常見的方法是使用任務的Factory屬性檢索可用來創建用于多個用途的TaskFactory實例。

例如,要創建運行操作的Task,可以使用工廠的StartNew方法:

//最簡單的線程示例Task.Factory.StartNew(() =>{    Console.WriteLine("我是使用Factory屬性創建的線程");});

運行結果如下:

如果想簡單的創建一個Task,那么使用Factory.NewStart()來創建,很簡便。

如果像對所創建的Task附加更多的定制和設置特定的屬性,請繼續往下看。

2.2使用Task實例實現多線程

//簡單的Task實例創建線程Action<object> action = (object obj) =>{    Console.WriteLine("Task={0}, obj={1}, Thread={2}", Task.CurrentId, obj.ToString(), Thread.CurrentThread.ManagedThreadId);};Task t1 = new Task(action, "參數");t1.Start();

運行結果如下:

//簡寫上面實例,并創建100個線程System.Diagnostics.Stopwatch watch = System.Diagnostics.Stopwatch.StartNew();int m = 100;Task[] tasks = new Task[m];for (int i = 0; i < m; i++){    tasks[i] = new Task((object obj) =>        {            Thread.Sleep(200);            Console.WriteLine("Task={0}, obj={1}, Thread={2},當前時間:{3}",            Task.CurrentId, obj.ToString(),            Thread.CurrentThread.ManagedThreadId,            System.DateTime.Now.ToString());        }, "參數" + i.ToString()    );    tasks[i].Start();}           Task.WaitAll(tasks);Console.WriteLine("線程耗時:{0},當前時間:{1}" ,watch.ElapsedMilliseconds,System.DateTime.Now.ToString());

運行結果如下:

2.3Task傳入參數

上面介紹了使用一個Action委托來完成任程,那么給線程中傳入參數,就可以使用System.Action<object>來完成。

傳入一個參數的示例:

/// <summary>/// 一個參數的方法/// </summary>/// <param name="parameter"></param>static void MyMethod(string parameter){    Console.WriteLine("{0}", parameter);}

調用如下:

//Task傳入一個參數Task myTask = new Task((parameter) => MyMethod(parameter.ToString()), "aaa");myTask.Start();

運行結果如下:

傳入多個參數如下:

/// <summary>/// 多個參數的方法/// </summary>/// <param name="parameter1"></param>/// <param name="parameter2"></param>/// <param name="parameter3"></param>static void MyMethod(string parameter1,int parameter2,DateTime parameter3){    Console.WriteLine("{0} {1} {2}", parameter1,parameter2.ToString(),parameter3.ToString());}

調用如下:

//Task傳入多個參數for (int i = 1; i <= 20; i++){                  new Task(() => { MyMethod("我的線程", i, DateTime.Now); }).Start();    Thread.Sleep(200);}

運行結果如下:

對于傳入多個參數,可以使用無參數委托包裝一個多參數的方法來完成。

2.4Task的結果

要獲取Task的結果,在創建Task的時候,就要采用Task<T>來實例化一個Task。

其中的T就是Task執行完成之后返回結果的類型。

通過Task實例的Result屬性就可以獲取結果。

System.Diagnostics.Stopwatch watch = System.Diagnostics.Stopwatch.StartNew();Task<int> myTask = new Task<int>(() =>{    int sum = 0;    for (int i = 0; i < 10000; i++)        sum += i;    return sum;});myTask.Start();           Console.WriteLine("結果: {0} 耗時:{1}", myTask.Result,watch.ElapsedMilliseconds);

運行結果如下:

使用Factory屬性來完成上面的示例:

//使用Factory屬性創建System.Diagnostics.Stopwatch watchSecond = System.Diagnostics.Stopwatch.StartNew();Task<int> myTaskSecond = Task.Factory.StartNew<int>(() =>{    int sum = 0;    for (int i = 0; i < 10000; i++)        sum += i;    return sum;});            Console.WriteLine("結果: {0} 耗時:{1}", myTaskSecond.Result, watchSecond.ElapsedMilliseconds);

運行結果如下:

多線程除以上的一些基礎知識,在處理各種并行任務和多核編程中的使用,小伙伴可以參考專門關于多線程的書籍學習。

想要完全深入的學習多線程需要慢慢修煉,不斷積累。

3. 本節要點:

A.本點簡單介紹了線程池ThreadPool的使用;

B.介紹一使用Task進行多線程創建及Tast的參數傳入和返回結果。

==============================================================================================

返回目錄

<如果對你有幫助,記得點一下推薦哦,如有有不明白或錯誤之處,請多交流>

<對本系列文章閱讀有困難的朋友,請先看《.net 面向對象編程基礎》>

<轉載聲明:技術需要共享精神,歡迎轉載本博客中的文章,但請注明版權及URL>

.NET 技術交流群:467189533 .NET 程序設計

==============================================================================================


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人第一页| 国外成人在线播放| 亚洲肉体裸体xxxx137| 日韩av观看网址| 欧美激情久久久久久| 国产有码一区二区| 日韩av电影在线播放| 亚洲va码欧洲m码| 国产日韩av在线播放| 亚洲成人网久久久| 最近2019中文字幕mv免费看| 国产精品无码专区在线观看| 日韩久久精品成人| 亚洲网站在线观看| 欧美伦理91i| 日韩欧美视频一区二区三区| 国产99久久精品一区二区| 精品视频www| 亚洲自拍偷拍第一页| 在线视频日本亚洲性| 久久久成人av| 久久精品国产99国产精品澳门| 亚洲一区精品电影| 国产在线视频91| 国产精品一区二区三区久久久| 久久噜噜噜精品国产亚洲综合| 亚洲自拍欧美色图| 欧美激情第一页xxx| 国产99视频精品免视看7| 日韩av综合中文字幕| 亚洲国产天堂久久综合网| 欧美高清视频在线观看| 国产日韩欧美日韩大片| 亚洲韩国日本中文字幕| 久久影视电视剧免费网站清宫辞电视| 久久韩国免费视频| 国产精品欧美日韩久久| 亚洲高清久久网| 欧美一区二区色| 亚洲剧情一区二区| 久久九九热免费视频| 成人精品视频在线| 亚洲黄色在线看| 午夜精品久久久久久久久久久久| 欧洲永久精品大片ww免费漫画| 91精品国产精品| 国产精品一久久香蕉国产线看观看| 亚洲午夜久久久久久久| 国产成人午夜视频网址| 国产日韩欧美夫妻视频在线观看| 亚洲欧洲免费视频| 久久久国产一区二区| 国产精品男女猛烈高潮激情| 亚洲精品一区久久久久久| 中文字幕日韩精品在线| 岛国精品视频在线播放| 91亚洲国产成人精品性色| 国产精品吊钟奶在线| 国产日韩在线观看av| 国产精品综合网站| 26uuu国产精品视频| 亚洲综合日韩中文字幕v在线| 性色av香蕉一区二区| 欧美一级淫片播放口| 精品久久久中文| 91免费在线视频| 日韩有码在线观看| 亚洲男人天堂久| 欧美亚洲激情视频| 91亚洲va在线va天堂va国| 色综合天天综合网国产成人网| 亚洲一区亚洲二区亚洲三区| 国产精品678| 国产日本欧美一区| 欧美激情精品久久久| 热久久这里只有| 91精品久久久久久久久久久久久久| 久久人人爽人人爽人人片亚洲| 亚洲精品一二区| 国产色婷婷国产综合在线理论片a| 欧美日韩黄色大片| 日韩av男人的天堂| 激情成人在线视频| 亚洲国产成人精品电影| 欧美精品电影免费在线观看| 91人人爽人人爽人人精88v| 久久久久久69| 亚洲欧美日韩一区在线| 欧美精品第一页在线播放| 97在线免费视频| 美女扒开尿口让男人操亚洲视频网站| 91在线观看欧美日韩| 亚洲精品国产suv| 97免费中文视频在线观看| 亚洲精品丝袜日韩| 日韩av免费在线观看| 国产亚洲精品va在线观看| 国产午夜精品美女视频明星a级| 国产91色在线|免| 亚洲国产精久久久久久久| 日韩精品在线观| 亚洲成人久久久久| 4k岛国日韩精品**专区| 精品无人区乱码1区2区3区在线| 亚洲国产天堂网精品网站| 久久亚洲综合国产精品99麻豆精品福利| 久久精品国亚洲| 欧美在线视频在线播放完整版免费观看| 国产精品久久久久秋霞鲁丝| 亚洲综合视频1区| 在线色欧美三级视频| 国产精品久久在线观看| 亚洲大胆人体在线| 亚洲情综合五月天| 久久综合久久美利坚合众国| 成人午夜在线影院| 国产日韩在线免费| 亚洲人午夜精品免费| 亚洲黄页视频免费观看| 亚洲精品电影网| 色噜噜亚洲精品中文字幕| 亚洲人成电影网站色| 国产精品免费一区豆花| 91精品中国老女人| 亚洲国产一区二区三区在线观看| 91久久嫩草影院一区二区| 国产伦精品一区二区三区精品视频| 欧美肥老妇视频| 免费91在线视频| 日韩在线精品视频| 91超碰caoporn97人人| 久久久久免费精品国产| 欧美在线一区二区视频| 日本亚洲欧洲色α| 亚洲综合在线做性| 日韩欧美精品在线观看| 国产精品视频在线观看| 91免费看国产| 日韩av免费在线看| 国产精品99久久久久久白浆小说| 国产精品高潮呻吟久久av野狼| 国产日韩欧美中文| 亚洲一区二区福利| 欧美激情中文字幕在线| 亚洲精品福利视频| 人人澡人人澡人人看欧美| 日韩国产中文字幕| 日韩电影在线观看中文字幕| 日本午夜精品理论片a级appf发布| 欧美成人小视频| 欧美色另类天堂2015| 日本国产欧美一区二区三区| 国产视频精品一区二区三区| 日本精品久久中文字幕佐佐木| 欧美日韩精品在线播放| 欧美精品福利视频| 亚洲午夜未满十八勿入免费观看全集| 精品国产老师黑色丝袜高跟鞋| 国产精品久久久久福利| 中国日韩欧美久久久久久久久| 91po在线观看91精品国产性色| 日韩国产精品亚洲а∨天堂免| 亚洲午夜精品久久久久久久久久久久| 久久久在线免费观看|