c# - 在控制台应用程序中异步和等待

标签 c# .net

鉴于这是下面的代码,我希望看到这个输出:

----- 输入主
----- 退出主程序
----- 185 毫秒过去了

但相反,它同步运行,Foo 阻止 MainAsync 返回。谁能解释一下?

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


    static async Task MainAsync()
    {
        Console.WriteLine("----- Enter main");
        await Foo();
        Console.WriteLine("----- Exit main");

        Console.ReadKey();
    }

    public static async Task Foo()
    {
        DateTime time = DateTime.Now;
        HttpClient client = new HttpClient();
        string urlContents = await client.GetStringAsync("http://msdn.microsoft.com");

        Console.WriteLine("----- " + (DateTime.Now - time).Milliseconds + "ms passed");
    }
}

最佳答案

await Foo(); 表示在 Foo 返回的 Task 完成之前,该方法的其余部分不会运行。这就是 await 某事的意思;在 Task 完成之前,该方法不会继续。因此,Console.WriteLine("----- Exit main"); 直到 Foo 完成后才会运行,直到它之后才会运行已经写出了花费的时间。

关于c# - 在控制台应用程序中异步和等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41023220/

相关文章:

c# - 访问 Windows 窗体控件时,BackgroundWorker 线程失败

c# - 如何使用托管 IIS 模块正确设置 HTTP header

c# - 如何在 C# 中声明一个类以便我可以链接方法?

c# - 如何使 WinForms UserControl 填充其容器的大小

c# - T 之间的映射 --> IHandler<T>

c# - 集合被修改;从 LIstBox 中删除 ListItem 时枚举可能不会执行错误

c# - 转换我已经创建的应用程序和数据库以支持单个数据库上的多个站点

c# - WP7 工具包 - 当通过代码(不是用户输入)更改时,如何忽略 ListPicker 的 "SelectionChanged"和 ToggleSwitch 的 "Checked"事件等事件?

java - 一个询问您要使用哪个网络浏览器的程序

c# - 将 foreach 循环减少为 linq 查询