欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

.NET多線程編碼結(jié)合異步編碼示例

freeflydom
2025年1月16日 11:8 本文熱度 730

1、創(chuàng)建一個(gè).NET8.0控制臺(tái)項(xiàng)目來演示多線程的應(yīng)用

2、快速創(chuàng)建一個(gè)線程

3、多次運(yùn)行程序,可以得到輸出結(jié)果

這就是多線程的特點(diǎn) - 當(dāng)多個(gè)線程并行執(zhí)行時(shí),它們的具體執(zhí)行順序是不確定的,除非我們使用同步機(jī)制(如 lock、信號(hào)量等)來控制執(zhí)行順序。

4、新建一個(gè)類TestThread,以及一個(gè)靜態(tài)的測(cè)試方法,用來做測(cè)試使用

5、在Program中,把輸出改成調(diào)用TestThread類中的測(cè)試方法再次執(zhí)行測(cè)試一下

6、執(zhí)行以后的輸出結(jié)果,如下圖所示

7、Thread.Sleep(毫秒):線程的等待(睡眠)


執(zhí)行結(jié)果:

8、Thread.Join() 代表線程執(zhí)行完畢以后,才可以繼續(xù)執(zhí)行后續(xù)的代碼

如下圖所示,在thread線程內(nèi)部執(zhí)行完成以后,很快就接著執(zhí)行最后的打印輸出方法了

9、Thread.Join(毫秒) 代表等待當(dāng)前線程執(zhí)行多長(zhǎng)時(shí)間,如果超出設(shè)定的毫秒數(shù),就會(huì)直接執(zhí)行后續(xù)的代碼

運(yùn)行程序,查看執(zhí)行結(jié)果


1、新增Test2方法,用來測(cè)試線程池ThreadPool使用

2、WaitCallback也是一個(gè)委托,傳入需要在線程池內(nèi)執(zhí)行的方法名稱。以下代碼內(nèi),“線程池”字符串為要執(zhí)行方法對(duì)應(yīng)的參數(shù)

ThreadPool:
這是.NET中的線程池類
它維護(hù)著一組可重用的線程
比直接創(chuàng)建新線程更有效率
QueueUserWorkItem:
這個(gè)方法用于將工作項(xiàng)添加到線程池隊(duì)列中
線程池會(huì)自動(dòng)分配空閑線程來執(zhí)行這些工作項(xiàng)
WaitCallback:
這是一個(gè)委托類型
定義了線程池中的線程要執(zhí)行的方法
可以接收一個(gè) object 類型的參數(shù)
TestThread.Test2:
這是你定義的要在線程池中執(zhí)行的方法
它有這樣的簽名:public static void Test2(object state)
"線程池":
這是傳遞給 Test2 方法的參數(shù)

3、除了直接傳入回調(diào)方法,也可以直接在線程池開啟的方法內(nèi),直接寫代碼塊來當(dāng)做多線程執(zhí)行的部分

4、線程池內(nèi),可以通過設(shè)置Manual信號(hào)量,來識(shí)別線程池內(nèi)的線程什么時(shí)候執(zhí)行完成。



**1、創(chuàng)建一個(gè)TestAsyncAction類,添加一個(gè)模擬的異步方法TestAction

2、使用Task快讀創(chuàng)建一個(gè)線程。最簡(jiǎn)單的方法:Task.Run(()=>{ 代碼塊 })

3、兩個(gè)線程并行執(zhí)行,查詢執(zhí)行結(jié)果

4、如果想等待新開線程執(zhí)行完再繼續(xù)執(zhí)行后續(xù)的代碼,可以使用如下方式:使用 await 等待整個(gè)操作完成

await Task.Run(async () =>
{
   await TestAsyncAction.TestAction();
});
代碼會(huì)等待異步操作完成才繼續(xù)執(zhí)行

執(zhí)行結(jié)果:

5、也可以使用Task.Factory創(chuàng)建一個(gè)任務(wù)工廠來實(shí)現(xiàn)

6、查看執(zhí)行結(jié)果


1、【異步結(jié)合多線程】如果有多個(gè)任務(wù)在執(zhí)行期間,在任意一個(gè)線程執(zhí)行完畢以后進(jìn)行執(zhí)行某種操作,可以使用 ContinueWhenAny來進(jìn)行

// See https://aka.ms/new-console-template for more information
using MultiThreading;
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}>>>>Hello, World!");
var tasks = new Task[3];
TaskFactory factory = new();
/*
 * .Unwrap() 主要是用來處理嵌套任務(wù)問題。
 * 使用 StartNew 執(zhí)行 async lambda 時(shí),會(huì)得到一個(gè) Task<Task> (雙層嵌套的Task)
 *          // 不使用 Unwrap
            var task1 = factory.StartNew(async () => {
                await Task.Delay(1000);
                return "Hello";
            });
            // task1 的類型是 Task<Task<string>>
            // 需要兩次 await
            string result1 = await (await task1);
    ---------------------------------------------------
            // 使用 Unwrap
            var task2 = factory.StartNew(async () => {
                await Task.Delay(1000);
                return "Hello";
            }).Unwrap();
            // task2 的類型是 Task<string>
            // 只需要一次 await
            string result2 = await task2;
 */
tasks[0] = factory.StartNew(async () =>
{
    await TestAsyncAction.AsyncAction1();
}).Unwrap();
tasks[1] = factory.StartNew(async () =>
{
    await TestAsyncAction.AsyncAction2();
}).Unwrap();
tasks[2] = factory.StartNew(async () =>
{
    await TestAsyncAction.AsyncAction3();
}).Unwrap();
_ = factory.ContinueWhenAny(tasks, x =>
{
    Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}>>>>正常代碼");
});
Console.ReadLine();//阻止程序退出
PS:如果后續(xù)代碼依賴于續(xù)聯(lián)任務(wù)的完成,使用 await
    如果不關(guān)心續(xù)聯(lián)任務(wù)何時(shí)完成,使用 _=

查看執(zhí)行結(jié)果:

2、【異步結(jié)合多線程】如果要等任務(wù)全部執(zhí)行完畢以后才執(zhí)行某個(gè)代碼塊,可以使用ContinueWhenAll

查看執(zhí)行結(jié)果:

PS// 可以使用 Task.WhenAny 替代 ContinueWhenAny
_ = Task.WhenAny(tasks).ContinueWith(t => {
    Console.WriteLine(">>>>正常代碼");
});

3、異步方法中 使用 WhenAll 和 WhenAny(這個(gè)僅模擬純IO操作,不涉及多線程)

  當(dāng)遇到 await 時(shí),當(dāng)前方法會(huì)返回到調(diào)用者
  主線程可以繼續(xù)處理其他工作(比如UI響應(yīng)處理其他事件等)
  這些任務(wù)會(huì)被放到線程池中執(zhí)行
  當(dāng)前方法內(nèi) await 后面的代碼會(huì)被打包成續(xù)接(continuation)
  這個(gè)續(xù)接會(huì)等待所有任務(wù)完成后才執(zhí)行
  但這個(gè)等待是異步的,不會(huì)占用主線程資源
  • .WhenAll()

查看執(zhí)行結(jié)果:

  • .WhenAny()

查看執(zhí)行結(jié)果:

?轉(zhuǎn)自https://www.cnblogs.com/sq1201/p/18664227


該文章在 2025/1/16 11:08:48 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved