gpt4 book ai didi

c# - 了解 "await"在异步方法中的用法

转载 作者:行者123 更新时间:2023-12-05 09:30:30 26 4
gpt4 key购买 nike

我正在运行以下代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Threading;

public class Program
{
public static void Main()
{
new Program().Test();
}

public async Task Test()
{
Console.WriteLine("starting...");
await Test2();
Console.WriteLine("done!");
Thread.Sleep(2*1000);
}

public async Task Test2()
{
Console.WriteLine("Task in delay...");
await Task.Delay(5000);
}

}

我期望的输出是:

starting...
task in delay...
done!

但是,当我运行代码时,我得到:

starting...
Task in delay...

然后程序终止。我错过了什么吗?我应该如何修改代码以获得预期的结果?

另一个问题——据我了解,在方法的最后一行使用await是多余的,如果我删除它,我怎么能在方法上await

最佳答案

Am I missing something?

是的;你没有等待测试

    public static async Task Main()
{
await new Program().Test();
}

如果没有它,Main 将在 Test 返回后立即完成,这将是第一次遇到不完整的 await - async 链从 Task.Delay 展开(这将是不完整的),将其余工作留在 Test/Test2 后台调度;由于没有剩余的非后台线程,进程退出。

请注意,您可以删除async 并只返回 任务,即

    public static Task Main()
=> new Program().Test();

这将非常相似地工作,尽管它稍微改变了同步异常的语义。如果有疑问:await

关于c# - 了解 "await"在异步方法中的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69523800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com