Task三個列子的分享

来源:http://www.cnblogs.com/wangrudong003/archive/2016/05/24/5523984.html
-Advertisement-
Play Games

這次要分享的是C#Task任務的幾個列子,感覺最實用的是封裝的分頁任務執行方法,這個方法步奏也是目前在我工作中執行多任務常用的,不知道各位也有這用的情況,那麼開始吧。 1.順序任務執行 1 //順序任務執行 2 Task.Factory.StartNew<int>(() => { Console.W ...


這次要分享的是C#Task任務的幾個列子,感覺最實用的是封裝的分頁任務執行方法,這個方法步奏也是目前在我工作中執行多任務常用的,不知道各位也有這用的情況,那麼開始吧。

1.順序任務執行

 1 //順序任務執行
 2             Task.Factory.StartNew<int>(() => { Console.WriteLine(1); return 1; }).
 3                 //等待5s以後才會依次輸出2,3
 4                  ContinueWith((task) =>
 5                  {
 6 
 7                      Stopwatch wt = new Stopwatch();
 8                      wt.Start();
 9                      Thread.Sleep(1000 * 5);
10                      wt.Stop();
11                      Console.WriteLine("等待了:{0}ms,輸出結果{1}", wt.ElapsedMilliseconds, 2);
12                  }).
13                  ContinueWith((task) => { Console.WriteLine(3); }).
14                  Wait();
View Code

  上面的代碼中也備註了一些文字說明,其中有關鍵詞語及意思如下:

  .Task.Factory.StartNew:創建一個Task實例,創建後自動開啟,無需在調用Start;

  .ContinueWith:看單詞的意思就明瞭,是繼續的意思,在這裡的效果也是等待上一個Task執行完畢了在繼續執行本次任務,這裡方法裡面每個任務是一層一層傳遞的

  效果圖:

  

  這裡有個地方註意,sleep這是了5s但是這裡使用Stopwatch統計出來只有4999ms,這個地方存在差異性,本章不解釋,有興趣朋友可以分享下或研究下。

 

  2.並行任務效果

 1 //並行任務
 2             var watch = new Stopwatch();
 3             //func方法(認知特點:任意長度參數,最後一個的類型是方法返回的返回值類型)
 4             Func<object, int> fun = (num) =>
 5             {
 6                 Thread.Sleep(1000 * 2);
 7                 Console.WriteLine("第{0}個", num);
 8                 return Convert.ToInt32(num);
 9             };
10             var len = 5;
11             var tasks = new Task<int>[len];
12             //開始計算處理時間
13             watch.Start();
14             for (int _i = 0; _i < len; _i++)
15             {
16                 //Task.Factory.StartNew直接開啟Task任務無需在使用start
17                 tasks[_i] = Task.Factory.StartNew<int>(fun, _i);
18             }
19             //10s等待
20             Task.WaitAll(tasks, 1000 * 10);
21             watch.Stop();
22             Console.WriteLine("tasks共使用時間:{0}s={1}ms", watch.ElapsedMilliseconds / 1000, watch.ElapsedMilliseconds);
View Code

  關鍵詞語及意思如下:

  .Func<object, int>這個是C#新增的特性,這個和Action最大的區別就是Func有返回值,其他的和Action相同任意長度參數個數和類型

  .Task.WaitAll這個方法有幾個重載,這裡用的是一個超時時間的方法,設置時間後在規定的時間就不繼續等待Task【】了,如果task【】在超時時間範圍內就執行完了,那麼直接通過,不用再等待超時時間

  效果:

  

這裡依然有統計時間查問題,忽略

 

3.分頁任務執行方法

 1 /// <summary>
 2         /// 批次任務執行方法
 3         /// </summary>
 4         /// <typeparam name="T">參數類型</typeparam>
 5         /// <param name="func">func方法</param>
 6         /// <param name="list">待執行數據</param>
 7         /// <param name="taskLen">任務量</param>
 8         /// <param name="timeOut">任務超時時間 預設30s</param>
 9         /// <returns></returns>
10         public static int _ExcuteTask<T>(Func<List<T>, int> func, List<T> list, int taskLen = 10, int timeOut = 30) where T : class
11         {
12             var result = 0;
13             //任務量
14             var tasks = new Task<int>[taskLen];
15             var page = list.Count / taskLen + (list.Count % taskLen > 0 ? 1 : 0);  //每個分得得需要執行的總條數 最有一個執行剩餘所有
16             for (var ji = 1; ji <= taskLen; ji++)
17             {
18                 //使用分頁方法獲取待執行數據
19                 var list01 = list.Skip((ji - 1) * page).Take(page).ToList();
20                 if (list01.Count <= 0) { break; }
21                 var task = Task.Run(() =>
22                 {
23 
24                     return func(list01);
25                 });
26                 tasks[ji - 1] = task;
27             }
28             //等待執行
29             Task.WaitAll(tasks, 1000 * 1 * timeOut);
30             //獲取執行成功條數
31             result = tasks.Where(b => b.IsCompleted).Sum(b => b.Result);
32 
33             return result;
34         }
View Code

  測試代碼:

 1 /// <summary>
 2         /// 測試執行底層數據方法
 3         /// </summary>
 4         /// <param name="list"></param>
 5         /// <returns></returns>
 6         static int _FuncTest(List<string> list)
 7         {
 8 
 9             foreach (var item in list)
10             {
11                 Thread.Sleep(1000 * 2);
12                 Console.WriteLine("TaskId:{1}輸出第{0}個值", item, Task.CurrentId);
13             }
14             return list.Count;
15         }
View Code
 1 //分頁任務執行方法
 2             var listT = new List<string>();
 3             for (int _i = 0; _i < 9; _i++)
 4             {
 5                 listT.Add(_i.ToString());
 6             }
 7             watch.Restart();
 8             //調用任務公共方法
 9             var result = _ExcuteTask(_FuncTest, listT, 3);
10             watch.Stop();
11             Console.WriteLine("待處理數據:{0}條,共處理成功數據:{1}條,使用時間:{2}ms", listT.Count, result, watch.ElapsedMilliseconds);
View Code

  這裡使用的是分頁的原理,把參數集合分發到創建的Task中,使用Task【】來處理這些數據,這裡和第二個例子有點相識就多了分頁寫法而已,最後統計執行成功的條數,以此來返回給調用者,方便記錄日誌,此方法目前是我經常使用的,不知道是否還有更好的,各位多多分享,謝謝。

  效果圖:

  

  以上就是這次的總結,希望多同學們有些幫助,有疑問或者問題請及時相互交流。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0.檢查配置 1. VMWare上運行的Ubuntu,並不能支持真實的GPU(除了特定版本的VMWare和特定的GPU,要求條件嚴格,所以我在VMWare上搭建好了Caffe環境後,又重新在Windows 7 64bit系統上安裝了Ubuntu 14.04 64bit系統,鏈接 "在此" ,以此來搭 ...
  • 註釋 註釋 註釋毫無疑問是讓別人以最快速度瞭解你代碼的最快途徑,但寫註釋的目的絕不僅僅是"解釋代碼做了什麼",更重要的儘量幫助代碼閱讀者對代碼瞭解的和作者一樣多。 當你寫代碼時,你腦海裡會有很多有價值的信息,但當其他人讀你代碼時,這些信息已經丟失,他們所見到的只是眼前代碼。 註釋約定 註釋約定 如果 ...
  • Insus.NET開發這樣多網站,客戶一直沒有這個要求。不過,現在有客戶有這樣的要求了。線上用戶訪問人數,也就是說,要為網站寫一個計數器,計數器的初始值為0,網站一開始運行時(Application_Start),就開始統計,當有用戶訪問時(Session_Start)計數器加1,當用戶訪問離開時( ...
  • 三大範式一直沒有記住,看了這個有了理解!挺好的記著,以後忘了,可以再看看! 為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為範式。範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的範式。 在實際開發中最為常見的設計範式 ...
  • 環境:Vs2103(TFS2013) 目的:去掉別人項目里的TFS控制,因為每次打開時會有提示信息 解決方法: 1.刪除隱藏的.$tf文件夾,搜索*.vssscc和*.vspscc這兩個尾碼的文件,刪除找到的文件. 2.使用文本編輯器打開*.sln文件,找到 GlobalSection(TeamFo ...
  • 剛到新單位,學習他們的源代碼,代碼里讀寫系統配置文件的XML代碼比較老套,直接寫在一個系統配置類里,沒有進行類的拆分,造成類很龐大,同時,操作XML的讀寫操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到結合之前所做的XML操作,完成了一個能夠讀取XML文 ...
  • 寫入: 插入100萬條數據:用InsertMany,耗時16s左右。 讀取: 讀取300萬條數據,耗時3600毫秒。 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...