c# - 了解 C# 中的异步/等待

标签 c# async-await

开始学习C#5.0的async/await,完全不懂。我不明白它如何用于并行性。我尝试了以下非常基本的程序:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Task task1 = Task1();
            Task task2 = Task2();

            Task.WaitAll(task1, task2);

            Debug.WriteLine("Finished main method");
        }

        public static async Task Task1()
        {
            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(5)));
            Debug.WriteLine("Finished Task1");
        }

        public static async Task Task2()
        {
            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(10)));
            Debug.WriteLine("Finished Task2");
        }

    }
}

这个程序只是阻塞了对 Task.WaitAll() 的调用并且永远不会完成,但我不明白为什么。我确定我只是遗漏了一些简单的东西,或者只是没有正确的思维模型,而且现有的博客或 MSDN 文章都没有帮助。

最佳答案

我建议您从我的 intro to async/await 开始并跟进 official Microsoft documentation on TAP .

正如我在介绍性博客文章中提到的,有几个 Task 成员是 TPL 的遗留物,在纯 async 代码中没有用处。 new TaskTask.Start 应替换为 Task.Run(或 TaskFactory.StartNew)。同样,Thread.Sleep 应替换为 Task.Delay

最后,我建议你不要使用Task.WaitAll;您的控制台应用程序应该只在使用 Task.WhenAll 的单个 TaskWait。通过所有这些更改,您的代码将如下所示:

class Program
{
    static void Main(string[] args)
    {
        MainAsync().Wait();
    }

    public static async Task MainAsync()
    {
        Task task1 = Task1();
        Task task2 = Task2();

        await Task.WhenAll(task1, task2);

        Debug.WriteLine("Finished main method");
    }

    public static async Task Task1()
    {
        await Task.Delay(5000);
        Debug.WriteLine("Finished Task1");
    }

    public static async Task Task2()
    {
        await Task.Delay(10000);
        Debug.WriteLine("Finished Task2");
    }
}

关于c# - 了解 C# 中的异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14177891/

相关文章:

多类型参数约束的 C# 泛型语法

c# - 如何在 C# 中为命令创建延迟?

c# - 真实世界的异步和等待代码示例

C#异步: How does a thread remember its local variables?

c# - 如何使用异步/等待方法管理类似 NDC 的 log4net 堆栈? (每个任务堆栈?)

c# - 指向 C 结构的第一个元素的指针与指向该结构的指针相同。但不是在 C# : Interop problem

c# - 清除 Cookie 不起作用?设置过期日期方法

C# SSH.NET - 一个 SSH 连接与多个 SSH 连接

c# - 异步/等待示例

rest - Vuejs 中的异步和等待