C#中TaskFactory實(shí)現(xiàn)線程任務(wù)
在 C# 中,TaskFactory 是 System.Threading.Tasks 命名空間下的一個(gè)類,它為任務(wù)的創(chuàng)建、管理和調(diào)度提供了一個(gè)簡便的方式。與直接使用 Task 類相比,TaskFactory 提供了更高層次的抽象,允許開發(fā)者更加靈活地控制任務(wù)的創(chuàng)建、執(zhí)行、取消、調(diào)度等操作。
1.TaskFactory的基本概念
TaskFactory 是一個(gè)幫助你創(chuàng)建和管理任務(wù)的工具類。它通過封裝 Task 的創(chuàng)建過程,使得任務(wù)的啟動(dòng)、調(diào)度和繼續(xù)等操作變得更加方便和靈活。
主要功能和用途
- 任務(wù)創(chuàng)建和啟動(dòng):通過
StartNew方法創(chuàng)建并啟動(dòng)新的任務(wù)。 - 任務(wù)調(diào)度控制:允許通過指定
TaskCreationOptions和TaskContinuationOptions來控制任務(wù)的行為。 - 任務(wù)的鏈?zhǔn)讲僮?/strong>:支持在一個(gè)任務(wù)完成后自動(dòng)執(zhí)行其他任務(wù)。
- 支持取消任務(wù):可以結(jié)合
CancellationToken來控制任務(wù)的取消。 - 處理異常:能夠在任務(wù)異常時(shí)進(jìn)行處理。
2.TaskFactory的基本功能
任務(wù)創(chuàng)建與啟動(dòng) (StartNew)
TaskFactory 提供了 StartNew 方法來創(chuàng)建并啟動(dòng)任務(wù)。這是其最常用的功能,它允許你異步執(zhí)行一個(gè)委托(通常是一個(gè) Action 或 Func)。
var factory = new TaskFactory();
Task task = factory.StartNew(() => {
Console.WriteLine("任務(wù)開始執(zhí)行...");
});
在這個(gè)例子中,StartNew 會(huì)啟動(dòng)一個(gè)新任務(wù),并異步執(zhí)行提供的委托。
任務(wù)選項(xiàng)控制:TaskCreationOptions
TaskFactory 允許你通過 TaskCreationOptions 來定制任務(wù)的創(chuàng)建方式。你可以指定任務(wù)的執(zhí)行方式、優(yōu)先級等。
常見的選項(xiàng)包括:
None:默認(rèn)選項(xiàng),任務(wù)使用線程池線程執(zhí)行。LongRunning:表示任務(wù)可能需要長時(shí)間執(zhí)行,通常會(huì)分配一個(gè)新的線程來執(zhí)行任務(wù),而不是使用線程池。AttachedToParent:指示任務(wù)是父任務(wù)的一部分。DenyChildAttach:阻止子任務(wù)附加到父任務(wù)。
var factory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);
Task task = factory.StartNew(() => {
Console.WriteLine("長時(shí)間運(yùn)行的任務(wù)");
});
任務(wù)鏈?zhǔn)讲僮鳎篊ontinueWith和TaskContinuationOptions
TaskFactory 允許你創(chuàng)建任務(wù)的鏈?zhǔn)讲僮?,也就是一個(gè)任務(wù)完成后可以自動(dòng)執(zhí)行另一個(gè)任務(wù)。你可以使用 ContinueWith 來設(shè)置后續(xù)任務(wù),并通過 TaskContinuationOptions 控制后續(xù)任務(wù)的執(zhí)行條件。
例如,你可以讓任務(wù)只在當(dāng)前任務(wù)成功完成時(shí)執(zhí)行后續(xù)任務(wù),或者只在任務(wù)失敗時(shí)執(zhí)行后續(xù)任務(wù)。
Task task1 = factory.StartNew(() => {
Console.WriteLine("任務(wù)1");
});
Task task2 = task1.ContinueWith(t => {
Console.WriteLine("任務(wù)2(在任務(wù)1完成后執(zhí)行)");
}, TaskContinuationOptions.OnlyOnRanToCompletion);
任務(wù)取消:CancellationToken
TaskFactory 可以與 CancellationToken 配合使用,以便支持任務(wù)取消。當(dāng)你需要取消一個(gè)任務(wù)時(shí),CancellationTokenSource 發(fā)出取消請求,Task 會(huì)檢查該請求并在合適的時(shí)機(jī)停止執(zhí)行。
var cts = new CancellationTokenSource();
var factory = new TaskFactory();
Task task = factory.StartNew(() => {
for (int i = 0; i < 10; i++) {
if (cts.Token.IsCancellationRequested) {
Console.WriteLine("任務(wù)已取消");
return;
}
Console.WriteLine("任務(wù)正在執(zhí)行...");
Thread.Sleep(1000);
}
}, cts.Token);
// 取消任務(wù)
cts.Cancel();
任務(wù)異常處理
TaskFactory 還支持任務(wù)的異常處理。如果任務(wù)在執(zhí)行過程中發(fā)生異常,你可以通過 ContinueWith 捕獲并處理這些異常。
Task task = factory.StartNew(() => {
throw new InvalidOperationException("發(fā)生錯(cuò)誤");
}).ContinueWith(t => {
if (t.Exception != null) {
Console.WriteLine($"任務(wù)發(fā)生了異常: {t.Exception.Message}");
}
}, TaskContinuationOptions.OnlyOnFaulted);
在這個(gè)例子中,ContinueWith 會(huì)在任務(wù)發(fā)生異常時(shí)被調(diào)用,并處理異常信息。
3.TaskFactory的實(shí)現(xiàn)原理與機(jī)制
TaskFactory 本質(zhì)上是對 Task 類的封裝,它通過 TaskCreationOptions 和 TaskContinuationOptions 提供了更靈活的任務(wù)調(diào)度和管理方式。
內(nèi)部工作機(jī)制
- 任務(wù)創(chuàng)建和啟動(dòng):
TaskFactory提供的方法(如StartNew)會(huì)創(chuàng)建一個(gè)Task實(shí)例,并將任務(wù)的執(zhí)行邏輯傳遞給Task。 - 任務(wù)調(diào)度:
TaskFactory可以通過不同的任務(wù)選項(xiàng)來控制任務(wù)的調(diào)度方式,例如將任務(wù)標(biāo)記為長時(shí)間運(yùn)行的任務(wù)。 - 任務(wù)鏈?zhǔn)讲僮?/strong>:
ContinueWith和TaskContinuationOptions使得開發(fā)者能夠創(chuàng)建任務(wù)之間的依賴關(guān)系,并定義任務(wù)完成后的后續(xù)動(dòng)作。 - 任務(wù)取消:任務(wù)的取消是通過
CancellationToken實(shí)現(xiàn)的。開發(fā)者可以通過傳遞CancellationToken來允許任務(wù)在某個(gè)條件下提前終止。
4. 主要的使用場景
場景 1:并行任務(wù)的啟動(dòng)
TaskFactory 用于啟動(dòng)多個(gè)并行執(zhí)行的任務(wù),特別是在需要對任務(wù)進(jìn)行細(xì)粒度控制時(shí)。例如,在處理多個(gè)獨(dú)立的任務(wù)時(shí),你可能會(huì)使用 TaskFactory 來啟動(dòng)這些任務(wù),并通過 Task.WhenAll 等方法等待所有任務(wù)完成。
Task task1 = factory.StartNew(() => {
// 執(zhí)行任務(wù)1
});
Task task2 = factory.StartNew(() => {
// 執(zhí)行任務(wù)2
});
Task.WhenAll(task1, task2).ContinueWith(t => {
Console.WriteLine("所有任務(wù)完成");
});
場景 2:長時(shí)間運(yùn)行的任務(wù)
使用 TaskCreationOptions.LongRunning 來創(chuàng)建需要長時(shí)間執(zhí)行的任務(wù)。通常,這些任務(wù)不應(yīng)使用線程池線程來執(zhí)行,而應(yīng)該單獨(dú)分配線程,以避免阻塞線程池中的其他任務(wù)。
var factory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);
Task task = factory.StartNew(() => {
// 執(zhí)行長時(shí)間任務(wù)
});
場景 3:任務(wù)的依賴關(guān)系
當(dāng)任務(wù)之間有依賴關(guān)系時(shí),TaskFactory 的 ContinueWith 方法非常有用。你可以指定某個(gè)任務(wù)成功完成后執(zhí)行另一個(gè)任務(wù),或者在任務(wù)失敗時(shí)執(zhí)行相應(yīng)的操作。
Task task1 = factory.StartNew(() => {
// 任務(wù)1的操作
});
Task task2 = task1.ContinueWith(t => {
// 任務(wù)2的操作
}, TaskContinuationOptions.OnlyOnRanToCompletion);
場景 4:任務(wù)取消
TaskFactory 還適用于需要支持取消操作的任務(wù)。例如,在下載文件、處理大批數(shù)據(jù)等場景中,你可以使用 CancellationToken 來取消正在執(zhí)行的任務(wù)。
var cts = new CancellationTokenSource();
Task task = factory.StartNew(() => {
// 執(zhí)行任務(wù)
}, cts.Token);
// 當(dāng)滿足某個(gè)條件時(shí),取消任務(wù)
cts.Cancel();
場景 5:異常處理
如果你需要在任務(wù)執(zhí)行過程中捕獲異常并處理,可以使用 ContinueWith 來指定異常處理邏輯。
Task task = factory.StartNew(() => {
throw new InvalidOperationException("任務(wù)執(zhí)行異常");
}).ContinueWith(t => {
if (t.Exception != null) {
Console.WriteLine($"捕獲異常: {t.Exception.Message}");
}
}, TaskContinuationOptions.OnlyOnFaulted);
5. 總結(jié)
TaskFactory 是 C# 中處理多線程和異步任務(wù)的一個(gè)非常有用的類,它通過簡化任務(wù)的創(chuàng)建、啟動(dòng)、調(diào)度和管理,極大提高了開發(fā)效率和代碼可讀性。通過 TaskFactory,你可以:
- 更靈活地創(chuàng)建任務(wù)并控制任務(wù)的執(zhí)行方式。
- 通過
CancellationToken控制任務(wù)的取消。 - 通過
ContinueWith實(shí)現(xiàn)任務(wù)的鏈?zhǔn)綀?zhí)行。 - 更加方便地管理任務(wù)的異常處理。
適用于并行計(jì)算、長時(shí)間運(yùn)行的任務(wù)、任務(wù)間依賴關(guān)系、任務(wù)取消和異常處理等多種場景。
TaskFactory 是 .NET 異步編程的強(qiáng)大工具,它幫助開發(fā)者以更清晰、結(jié)構(gòu)化的方式處理任務(wù)的執(zhí)行和管理。
到此這篇關(guān)于C#中TaskFactory實(shí)現(xiàn)線程任務(wù)的文章就介紹到這了,更多相關(guān)C# TaskFactory內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#利用GDI+給圖片添加文字(文字自適應(yīng)矩形區(qū)域)
這篇文章主要給大家介紹了關(guān)于C#利用GDI+給圖片添加文字(文字自適應(yīng)矩形區(qū)域)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2018-04-04
c#入門之枚舉和結(jié)構(gòu)體使用詳解(控制臺(tái)接收字符串以相反的方向輸出)
這篇文章主要介紹了c#入門之枚舉和結(jié)構(gòu)體使用詳解,最后提供了編寫控制臺(tái)應(yīng)用程序接收字符串并做相應(yīng)處理的小示例,需要的朋友可以參考下2014-04-04
C#中的時(shí)間顯示格式(12小時(shí)制VS24小時(shí)制)
這篇文章主要介紹了C#中的時(shí)間顯示格式(12小時(shí)制VS24小時(shí)制),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

