.net 多線程 Thread ThreadPool Task

来源:https://www.cnblogs.com/Rookieflying/archive/2019/02/24/10428673.html
-Advertisement-
Play Games

先準備一個耗時方法 /// <summary>/// 耗時方法/// </summary>/// <param name="name"></param>private void DoSomeThing(string name){ Console.WriteLine($"開始執行{name}, {Th ...


先準備一個耗時方法 /// <summary>
/// 耗時方法
/// </summary>
/// <param name="name"></param>
private void DoSomeThing(string name)
{
                 Console.WriteLine($"開始執行{name}, {Thread.CurrentThread.ManagedThreadId.ToString("00")} ,{DateTime.Now}");
                 int num = 1;

                 for (int i = 0; i < 100000000; i++)
                 {
                                 num++;
                 }
                 Thread.Sleep(1000);

              Console.WriteLine($"結束執行{name}, {Thread.CurrentThread.ManagedThreadId.ToString("00")} ,{DateTime.Now},{num}");
}     .net Framework框架1.0和1.1時期,多線程,用Thread   ThreadStart  threadStart = new ThreadStart(()=>this.DoSomeThing("Thread")); Thread thread = new Thread(threadStart); thread.Start();// 開始執行多線程任務了。   //thread.Start();預設是前臺線程,UI退出後,還是會繼續執行完,如果thread.IsBackgroud=true;//就變成主線程關閉就直接關閉了   thread.Join();//這個方法是讓主線程等著當前線程完成之後再執行   thread.Suspend();//暫停  過時方法不推薦 thread.Resume();//重啟  過時方法不推薦 thread.Abort();//銷毀  過時方法不推薦   基於Thread封裝一個支持回調 private void ThreadWithCallback(ThreadStart threadStart  Action callback) {           ThreadStart  startNew = new ThreadStart(                   ()=>                      {                              threadStart.Invoke();//執行傳入的線程方法                              callback.Invoke(); //執行回調函數                      }               );           Thread thread = new Thread(startNew);            thread.Start(); }   調用這個方法: ThreadStart threadStart = new ThreadStart(() => this.DoSomeThing("Thread"));
 Action callback = () => Console.WriteLine("這是回調函數");   this.ThreadWithCallback(threadStart , callback );     /// <summary>
/// 基於Thread封裝帶返回的
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="funcT"></param>
/// <returns></returns>
private Func<T> ThreadWithReturn<T>(Func<T> funcT)
{
           T t = default(T);

            ThreadStart startNew = new ThreadStart(()=> {
            t = funcT.Invoke();
            });
            Thread thread = new Thread(startNew);
            thread.Start();
            return new Func<T>(()=> 
            {
                thread.Join();
                return t;
             });
}   調用這個方法 {
Func<int> func = this.ThreadWithReturn(() => 222);

Console.WriteLine( func.Invoke());

}   .net Framework框架2.0時期,多線程,用ThreadPool   ThreadPool.QueueUserWorkItem(o=> {           Thread.sleep(2000);            this.DosomeThing("ThreadPool"); } //這個就是開啟一個子線程。   如果要控制等待,就用  ManualResetEvent mre = new ManualResetEvent(false);//預設填false ThreadPool.QueueUserWorkItem(o => {
            Thread.Sleep(2000);
            this.DoSomeThing("ThreadPool");
            mre.Set();//這個設置之後
});
            mre.WaitOne();//當mre.Set之後,主線程就可以等待子線程執行完成之後再執行
             
            Console.WriteLine($"this is end ");   .net Framework框架3.0時期,多線程,用Task   Task.Run(()=>this.DoSomeThing("task")); //就開啟執行子線程了   推薦使用Task的原因:1.使用的是線程池的線程,全部都是後臺線程                                     2、Api很強大   TaskFactory taskFactory = Task.Factory(); taskFactory.StartNew(()=>this.DoSomeThing("task1"));//跟Task.Run的效果一樣 taskFactory.StartNew(()=>this.DoSomeThing("task2")); taskFactory.StartNew(()=>this.DoSomeThing("task3")); taskFactory.StartNew(()=>this.DoSomeThing("task4")); taskFactory.StartNew(()=>this.DoSomeThing("task5"));//執行多個子線程   需要多線程加快速度,同時又要求全部完成後,執行新的任務 多業務操作希望併發,但是全部完成後,執行新的任務   List<Task> tkList = new List<Task>();   tkList.Add(taskFactory.StartNew(()=>this.DoSomeThing("task1"))); tkList.Add(taskFactory.StartNew(()=>this.DoSomeThing("task2"))); tkList.Add(taskFactory.StartNew(()=>this.DoSomeThing("task3")));   Task.WaitAll(tkList.toArray()); ConSole.WriteLine("全部完成之後,執行任務");     需要多線程加快速度,同時又要求一個任務完成後,執行新的任務 多業務操作希望併發,但是一個任務完成後,執行新的任務 Task.WaitAny(tkList.toArray()); ConSole.WriteLine("一個任務完成之後,執行任務");   不過兩個方法同時使用的時候,WaitAny放在WaitAll前面。   但是上面2個方法都會卡住UI界面   還有2個方法也可以執行同樣的任務,而且不卡界面,類似回調   taskFactory.ContinueWhenAll(tasks.ToArray(), tList => { Console.WriteLine("全部執行完之後執行,而且不卡界面"); });   taskFactory.ContinueWhenAny(tasks.ToArray(), t => { Console.WriteLine("執行一個任務後,執行,不卡界面"); });   4種方法可以一起使用,如果想先執行不卡界面的方法,後執行Task.WaitAll的方法,就可以先把這2個方法也添加進集合裡面 tasks.Add(taskFactory.ContinueWhenAll(tasks.ToArray(), tList => { Console.WriteLine("全部執行完之後執行,而且不卡界面"); }));

tasks.Add(taskFactory.ContinueWhenAny(tasks.ToArray(), t => { Console.WriteLine("執行一個任務後,執行,不卡界面"); }));   Task.WaitAny(tkList.toArray()); ConSole.WriteLine("一個任務完成之後,執行任務"); Task.WaitAll(tkList.toArray()); ConSole.WriteLine("全部完成之後,執行任務");     可以給每個子線程,取一個標識
Task tack= taskFactory.StartNew(t => Console.WriteLine("新的一個任務"),"標識Token"); //設置標識
Console.WriteLine(tack.AsyncState.ToString());//獲取標識並且列印 tack.AsyncState   獲取返回值 //Task<int> task = taskFactory.StartNew(()=>123456);
//int result = task.Result;
//Console.WriteLine(result);     一個線程執行後馬上執行另一個 taskFactory.StartNew(t=>this.DoSomeThing("第一個方法")).ContinuWith(t=>ConSole.WriteLine("第二個"))      
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Win10構建Python全棧開發環境With WSL === [toc] 在學習Python全棧過程中,隨著後面地深入,進入實際項目地開發階段後,越發地發現,項目要使用的第三方軟體(redis git等)或者外界(支付寶開放平臺/微信開放平臺)聯繫越來越多,自己構建一個開發web服務,以及Pyth ...
  • 使用maven package打包項目時出現配置文件丟失的現象,此類問題解決辦法如下: 在web項目pom.xml 文件中添加如下: 在<build>標簽中添加如下配置: 說明:<include>標簽中配置自己項目中配置文件的尾碼名稱就闊以; 完畢! ...
  • 一、vector類型簡介 標準庫:集合或動態數組,我們可以放若幹對象放在裡面。 vector他能把其他對象裝進來,也被稱為容器 二、定義和初始化vector對象 (1)空的vector (2)元素拷貝的初始化方式 (3)C++11標準中,用列表初始化方法給值,用{}括起來 (4)創建指定數量的元素 ...
  • 原文地址:http://www.runoob.com/python/python-func-open.html ...
  • 一、前言 int,float,char,C++標準庫提供的類型:string,vector。 string:可變長字元串的處理;vector一種集合或者容器的概念。 二、string類型簡介 C++標準庫中的類型,代表一個可變長的字元串 char str[100] = “I Love China”; ...
  • 對二維數組指定的鍵名排序,首先大家想到的是array_multisort函數,關於array_multisort的用法我之前也寫了一篇廢話不多言,我們看個實例: 細心的朋友會看到,鍵名重置了,鍵名從0開始,顯然這可能不是我們想要的結果,那如何保持鍵名不變? 我們再看個示例: 這裡我們也可以精簡下ar ...
  • 一、前言 在非靜態頁面的項目開發中,必定會涉及到對於資料庫的訪問,最開始呢,我們使用 Ado.Net,通過編寫 SQL 幫助類幫我們實現對於資料庫的快速訪問,後來,ORM(Object Relational Mapping,對象關係映射)出現了,我們開始使用 EF、Dapper、NHibernate ...
  • 百度一下資料庫事務隔離,臟讀等,我想也是一堆。有些老學究扯一堆理論,有些通篇全是代碼,都讓人看的有種說不出蛋疼的感覺。本文用圖文並茂的方式,配上行雲流水般的代碼,非要擺清楚這個問題。本文代碼已提交至碼雲(點擊這裡下載)。 事務是現代關係型資料庫的核心之一。在多個事務併發操作資料庫(多線程、網路併發等 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...