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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...