为什么我的任务只起作用一次

本文关键字:一次 起作用 我的 任务 为什么 | 更新日期: 2023-09-27 18:27:30

我想每2秒打印一次数字,但最终我只得到0。我需要做什么才能每2秒得到一次?

结果:

    0
    1
    .
    .
    49

  private static void Main(string[] args) {
    Send();
  }
  public static async Task Send() {
    for (int i = 0; i < 50; i++) {
        Console.WriteLine(i);
        await Task.Delay(2000);
    }
  }

为什么我的任务只起作用一次

好吧,因为您的Main方法不会等待send方法完成,并且您不能使用await关键字来实现这一点,因为编译器不允许使用async Main,在这种情况下,您可以简单地使用Task.Run

 private static void Main(string[] args)
    {
        Task.Run(async () =>
        {
            await Send();
        }).Wait();
    }
    public static async Task Send()
    {
        for (int i = 0; i < 50; i++)
        {
            Console.WriteLine(i);
            await Task.Delay(2000);
        }
    }

您缺少的是一个Console.ReadLine()调用,用于在执行任务之前停止控制台退出程序。测试了下面的代码,它工作正常。

    private static void Main(string[] args)
    {
        Send();
        Console.ReadLine();
    }
    public static async Task Send()
    {
        for (int i = 0; i < 50; i++)
        {
            Console.WriteLine(i);
            await Task.Delay(2000);
        }
    }

基于Josephs的答案,但在更通用的"如何做异步控制台应用程序"-方式

在控制台应用程序中使用异步代码可能有点棘手。我通常使用一个替代MainAsync方法,原始Main()调用该方法并对其进行阻塞等待。

下面是一个如何做到这一点的例子:

class Program
{
    static void Main(string[] args)
    {
        Task mainTask = MainAsync(args);
        mainTask.Wait();
        // Instead of writing more code here, use the MainAsync-method as your new Main()
    }
    static async Task MainAsync(string[] args)
    {
        await Send();
        Console.ReadLine();
    }
    public static async Task Send()
    {
        for (int i = 0; i < 50; i++)
        {
            Console.WriteLine(i);
            await Task.Delay(2000);
        }
    }
}