在C#中,
Task.ContinueWith
方法是一個強大的工具,用於在異步操作完成後執行後續操作。它允許你定義一個任務(
Task
),然後在這個任務完成後,自動執行另一個任務。這在處理異步編程時特別有用,比如在進行網路請求、檔I/O操作或資料庫查詢後需要執行某些操作。
下面,我們將透過一個簡單的範例來演示如何使用
Task.ContinueWith
。
範例場景
假設我們有一個需要從遠端伺服器獲取數據的任務,獲取數據後,我們需要對數據進行處理,並在處理完成後打印結果。
實作程式碼
using System;
using System.Threading.Tasks;
classProgram
{
staticasync Task Main(string[] args)
{
Console.WriteLine("開始異步任務...");
// 模擬從遠端伺服器獲取數據的任務
Task<string> getDataTask = GetDataFromServerAsync();
// 使用ContinueWith定義獲取數據後的處理任務
Task processDataTask = getDataTask.ContinueWith(t =>
{
if (t.IsFaulted)
{
Console.WriteLine("獲取數據時出錯: " + t.Exception.InnerException.Message);
}
elseif (t.IsCanceled)
{
Console.WriteLine("任務被取消");
}
else
{
string data = t.Result; // 獲取前一個任務的結果
string processedData = ProcessData(data); // 處理數據
Console.WriteLine("處理後的數據: " + processedData);
}
});
await processDataTask; // 等待處理任務完成
Console.WriteLine("所有任務完成");
}
// 模擬從遠端伺服器獲取數據的異步方法
staticasync Task<string> GetDataFromServerAsync()
{
await Task.Delay(2000); // 模擬網路延遲
return"原始數據";
}
// 模擬數據處理方法
staticstringProcessData(string data)
{
return"處理後的" + data;
}
}
程式碼解釋
GetDataFromServerAsync 方法模擬了一個從遠端伺服器獲取數據的異步操作。在這個範例中,我們只是使用
Task.Delay
來模擬網路延遲,並返回一個字串 "原始數據"。在
Main
方法中,我們首先啟動GetDataFromServerAsync
任務。然後,我們使用ContinueWith
方法來定義一個在這個任務完成後需要執行的新任務。這個新任務會檢查前一個任務的狀態(是否出錯、是否被取消),如果一切正常,它會獲取前一個任務的結果(即獲取到的數據),對數據進行處理,並打印處理後的結果。最後,我們使用
await
關鍵字等待處理任務完成,並打印 "所有任務完成" 來表示整個流程已經結束。
註意事項
當使用
ContinueWith
時,需要註意前一個任務的狀態。如果前一個任務出錯或被取消,
ContinueWith
定義的任務仍然會執行,但你需要檢查並處理這些情況。
ContinueWith
方法有多個多載,允許你指定任務的排程器、任務繼續執行的選項等。在這個簡單範例中,我們使用了預設設定。
在實際套用中,你可能還需要處理更復雜的錯誤場景、取消操作以及任務之間的數據傳遞等問題。