理解 C# 中的异步/等待 [英] Understanding async / await in C#

查看:24
本文介绍了理解 C# 中的异步/等待的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm starting to learn about async / await in C# 5.0, and I don't understand it at all. I don't understand how it can be used for parallelism. I've tried the following very basic program:

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 文章都没有帮助.

This program just blocks on the call to Task.WaitAll() and never finishes, but I am not understanding why. I'm sure I'm just missing something simple or just don't have the right mental model of this, and none of the blogs or MSDN articles that are out there are helping.

推荐答案

我建议你从我的 async/await 介绍以及 关于 TAP 的官方 MSDN 文档.

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

As I mention in my intro blog post, there are several Task members that are holdovers from the TPL and have no use in pure async code. new Task and Task.Start should be replaced with Task.Run (or TaskFactory.StartNew). Similarly, Thread.Sleep should be replaced with Task.Delay.

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

Finally, I recommend that you do not use Task.WaitAll; your Console app should just Wait on a single Task which uses Task.WhenAll. With all these changes, your code would look like:

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# 中的异步/等待的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆