C#的Task是什么?如何处理异步操作的返回值?

来源:这里教程网 时间:2026-02-21 17:31:29 作者:

Task 是 C# 中用于表示一个将在未来完成并返回某种类型结果的异步操作。其中 T 是返回值的类型。它属于 .NET 的任务并行库(TPL),是处理异步编程的核心类型之一。

当你调用一个返回 Task 的异步方法时,该方法会立即返回一个任务对象,代表正在执行的操作。你可以在不阻塞主线程的情况下等待其完成,并获取它的返回值。

如何定义和使用 Task

一个典型的异步方法定义如下:

async Task GetNumberAsync()
{
    await Task.Delay(1000);
    return 42;
}

调用这个方法并获取返回值的方式有多种:

使用 await 获取返回值

在 async 方法中,使用 await 可以等待任务完成,并直接取得返回值:

async Task ProcessAsync()
{
    int result = await GetNumberAsync();
    Console.WriteLine(result); // 输出 42
}

这是最推荐的方式,代码简洁且不会阻塞线程。

同步等待(不推荐但可用)

如果必须在同步上下文中获取结果,可以使用 .Result.Wait()

Task task = GetNumberAsync();
int result = task.Result; // 阻塞直到完成

注意:这可能会导致死锁,特别是在 UI 或 ASP.NET 等上下文中,应尽量避免。

通过 ContinueWith 处理结果

也可以使用 ContinueWith 在任务完成后执行后续操作:

GetNumberAsync().ContinueWith(t =>
{
    if (t.IsFaulted)
        // 处理异常
    else
        Console.WriteLine(t.Result);
});

这种方式适合不需要立即获取结果的场景,但不如 await 直观。

异常处理

异步操作中的异常会被封装到 Task 中。使用 await 时,异常会像同步代码一样抛出:

async Task HandleErrorAsync()
{
    try
    {
        await GetNumberAsync();
    }
    catch (Exception ex)
    {
        Console.WriteLine("发生错误:" + ex.Message);
    }
}

如果未使用 await,需检查 Task 的 IsFaulted 和 Exception 属性。

基本上就这些。使用 await 配合 async 方法是处理 Task 返回值的最佳实践。

相关推荐

热文推荐