C# Task的使用
C#中的Task
类是.NET框架中用于实现异步编程的核心组件之一,它在.NET Framework 4
及更高版本以及.NET Core
中广泛使用。Task
对象代表一个异步操作,并提供了跟踪异步操作状态、获取结果和处理完成通知的方法。
Task
类提供了对异步操作的封装,使得开发人员可以更容易地编写异步代码。Task
类位于 System.Threading.Tasks
命名空间下。在C#
中,使用Task
可以很方便地执行并行任务。
以下是C#中Task
的几种常见用法:
1.执行异步操作:
使用Task.Run()方法可以将工作提交给线程池来异步执行:
Task<int> task = Task.Run(() =>
{
int result = LongRunningCalculation(); // 长时间运行的计算
return result;
});
// 等待任务完成并获取结果
int finalResult = await task;
2.Async/Await:
在异步方法中结合async和await关键字来编写流畅的异步代码:
async Task<int> AsyncMethod()
{
// 异步等待网络请求或IO操作等
var data = await DownloadDataAsync();
// 处理数据...
return ProcessedData;
}
// 调用异步方法
Task<int> task = AsyncMethod();
// 如果需要等待结果
int result = await task;
3.创建和启动Task:
除了Task.Run(),还可以直接实例化Task并通过.Start()方法手动启动:
Task task = new Task(() => DoSomething());
task.Start();
或者使用TaskFactory
创建并开始新任务:
TaskFactory factory = new TaskFactory();
Task task = factory.StartNew(() => DoSomethingLong("Using TaskFactory"));
4.取消任务:
可以通过传递CancellationToken到Task.Run()或Task.Factory.StartNew()来支持任务取消:
CancellationTokenSource cts = new CancellationTokenSource();
Task task = Task.Run(async () =>
{
while (!cts.IsCancellationRequested)
{
// 执行循环操作直到取消令牌被标记
}
cts.Token.ThrowIfCancellationRequested(); // 如果已取消,则抛出异常
}, cts.Token);
// 某个时刻取消任务
cts.Cancel();
5.同步等待(非推荐):
在特定场景下,可以直接同步等待任务完成,但这通常会导致当前线程阻塞:
Task.Wait(); // 不推荐,可能导致死锁
6.异步等待多个任务完成:
使用Task.WhenAll()等待多个任务同时完成:
Task[] tasks = new Task[5];
for (int i = 0; i < 5; i++)
{
tasks[i] = Task.Run(() => SomeWork(i));
}
await Task.WhenAll(tasks);
7.等待任意任务完成:
使用Task.WhenAny()等待任意一个任务完成:
Task[] tasks = ...;
Task completedTask = await Task.WhenAny(tasks);
以上仅是对C#中Task
类使用的一些基本示例。
请注意,
实际开发中,可能根据具体需求进行更复杂的异步编程。需
要根据具体情况来评估任务的大小和数量,以确保并行任务的效率和可靠性。