C# 中提供了 Task 类型,可以轻松地执行异步操作,下面是关于 Task 的详细攻略:
1. Task 的基本使用方法
Task 提供了许多方法来启动新的任务,其中最常见的方法是 Task.Run
。以下是使用 Task.Run
执行异步操作的示例:
static async Task<int> CalculateSumAsync()
{
int sum = 0;
await Task.Run(() =>
{
for (int i = 0; i < 1000; i++)
{
sum += i;
}
});
return sum;
}
static async void Test()
{
int result = await CalculateSumAsync();
Console.WriteLine(result);
}
在上面的代码中,我们定义了一个异步方法 CalculateSumAsync
,并在其中使用 Task.Run
来执行计算和操作。我们还定义了另一个方法 Test
,它使用 CalculateSumAsync
方法计算和,并打印结果。
注意,我们在 CalculateSumAsync
方法中使用了 await
操作符来暂停方法的执行,直到异步任务完成才继续执行。
2. Task 的高级使用方法
Task 类型还提供了许多高级特性,如任务组、超时和取消。下面是一些 Task 的高级使用方法的示例:
2.1 使用 Task.WaitAll 同时执行多个任务
static async Task<int[]> CalculateSumAsync(params int[] numbers)
{
var tasks = new List<Task<int>>();
foreach (int number in numbers)
{
tasks.Add(Task.Run(() =>
{
int sum = 0;
for (int i = 0; i < number; i++)
{
sum += i;
}
return sum;
}));
}
return await Task.WhenAll(tasks);
}
static async void Test()
{
int[] results = await CalculateSumAsync(10, 20, 30);
Console.WriteLine(string.Join(", ", results));
}
这个示例演示了如何同时计算多个累加和。在 CalculateSumAsync
方法中,我们为每个输入参数启动一个新的异步任务,并使用 Task.WhenAll
等待所有任务完成。在 Test
方法中,我们调用 CalculateSumAsync
方法,并打印结果数组。
2.2 使用 Task.Delay 创建一个带有超时的异步操作
static async Task<string> DownloadFileAsync(string url)
{
var client = new HttpClient();
await Task.Delay(TimeSpan.FromSeconds(5));
var response = await client.GetAsync(url);
return await response.Content.ReadAsStringAsync();
}
static async void Test()
{
try
{
var result = await DownloadFileAsync("https://www.example.com/download");
Console.WriteLine(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
这里的示例演示了如何为异步操作设置超时。在 DownloadFileAsync
方法中,我们等待 5 秒钟,然后使用 HttpClient 下载文件。在 Test
方法中,我们调用 DownloadFileAsync
方法并打印结果。如果下载花费的时间超过了 5 秒钟,会抛出 TimeoutException 异常。
2.3 使用 CancellationTokenSource 取消异步操作
static async Task<string> DownloadFileAsync(string url, CancellationToken cancellationToken)
{
var client = new HttpClient();
var response = await client.GetAsync(url, cancellationToken);
return await response.Content.ReadAsStringAsync();
}
static async void Test()
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
try
{
var result = await DownloadFileAsync("https://www.example.com/download", cts.Token);
Console.WriteLine(result);
}
catch (OperationCanceledException)
{
Console.WriteLine("Download canceled");
}
}
这个示例演示了如何取消一个异步操作。在 DownloadFileAsync
方法中,我们使用 HttpClient 下载文件,并在下载过程中传递一个取消令牌。在 Test
方法中,我们创建一个 CancellationTokenSource 对象,设置超时时间为 10 秒钟,并使用它来取消异步操作。如果下载在超时时间内未完成,则会抛出 OperationCanceledException 异常。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#如何使用Task执行异步操作 - Python技术站