一、Task.Run() 是什么
Task.Run() 是 .NET Framework 4.5 引入的将工作项排队到线程池的便捷方法。它的本质是把一个委托(Action 或 Func)抛到 ThreadPool 的队列中,由线程池线程异步执行,并返回一个 Task 或 Task<T> 作为异步操作的句柄。
// 无返回值
Task task = Task.Run(() => DoWork());
// 有返回值
Task<int> task = Task.Run(() => Calculate(3, 5));
int result = await task; // result = 8
一句话定义:Task.Run() = 把一段代码丢到后台线程执行,并给你一个可以 await 的凭证。
二、为什么需要 Task.Run()
在 Task.Run() 出现之前,开发者需要这样写:
// .NET 4.0 时代
Task.Factory.StartNew(() => DoWork(), CancellationToken.None,
TaskCreationOptions.None, TaskScheduler.Default);
繁琐且容易出错(比如默认调度器可能不是线程池)。Task.Run() 就是 Task.Factory.StartNew() 的安全快捷版,它:
-
默认使用
TaskScheduler.Default(即线程池) -
自动解包嵌套 Task(Unwrap)
-
默认
DenyChildAttach(防止子任务意外附加) -
代码更简洁
三、基础用法
1. 执行 CPU 密集型工作
public async Task ProcessDataAsync()
{
// 把 CPU 密集计算丢到后台
int result = await Task.Run(() =>
{
int sum = 0;
for (int i = 0; i < 100000000; i++)
sum += i;
return sum;
});
Console.WriteLine($"计算结果: {result}");
}
2. 并行执行多个任务
public async Task RunParallelAsync()
{
Task<int> task1 = Task.Run(() => FetchDataFromDb());
Task<int> task2 = Task.Run(() => FetchDataFromApi());
Task<int> task3 = Task.Run(() => CalculateHash());
// 同时等待所有任务完成
int[] results = await Task.WhenAll(task1, task2, task3);
Console.WriteLine($"DB: {results[0]}, API: {results[1]}, Hash: {results[2]}");
}
3. 带取消功能的后台任务
public async Task RunWithCancellationAsync(CancellationToken cancellationToken)
{
try
{
int result = await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
cancellationToken.ThrowIfCancellationRequested();
Thread.Sleep(100); // 模拟工作


1599

被折叠的 条评论
为什么被折叠?



