Skip to content

C# 多线程 05-使用 C#6.0 01-使用 await 操作符获取异步任务结果

🏷️ 《C# 多线程》

使用 await 操作符获取异步任务结果

C# 5.0 中引入了新的语言特性,称为异步函数(asynchronous function)。它是 TPL 之上的更高级别的抽象,真正简化了异步编程。

下面代码中 AsynchronyWithTPLAsynchronyWithAwait 实现的功能是一样的,可以看出使用 asyncawait 关键字的写法更加简洁而且易懂。

csharp
/// <summary>
/// 使用 await 操作符获取异步任务结果
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
    Task t = AsynchronyWithTPL();
    t.Wait();

    t = AsynchronyWithAwait();
    t.Wait();

    Console.ReadLine();
}

// 标准 TPL 的写法
static Task AsynchronyWithTPL()
{
    Task<string> t = GetInfoAsync("Task 1");
    Task t2 = t.ContinueWith(task => Console.WriteLine(t.Result),
        TaskContinuationOptions.NotOnFaulted);
    Task t3 = t.ContinueWith(task => Console.WriteLine(t.Exception.InnerException),
        TaskContinuationOptions.OnlyOnFaulted);
    return Task.WhenAny(t2, t3);
}

// 使用 async await 关键字的写法
static async Task AsynchronyWithAwait()
{
    try
    {
        string result = await GetInfoAsync("Task 2");
        Console.WriteLine(result);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

static async Task<string> GetInfoAsync(string name)
{
    await Task.Delay(TimeSpan.FromSeconds(2));
    return $"Task {name} is running on a thread id {Thread.CurrentThread.ManagedThreadId}. " +
        $"Is thread pool thread: {Thread.CurrentThread.IsThreadPoolThread}";
}

打印结果

txt
Task Task 1 is running on a thread id 4. Is thread pool thread: True
Task Task 2 is running on a thread id 5. Is thread pool thread: True