为什么我的任务只能工作一次?

时间:2015-12-19 22:52:25

标签: c# asynchronous task

我想打印每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);
    }
  }

3 个答案:

答案 0 :(得分:1)

好吧,只是因为您的Main方法不会等待发送方法完成,您无法使用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);
        }
    }

答案 1 :(得分:0)

您缺少的是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);
        }
    }

答案 2 :(得分:0)

以Josephs的答案为基础,但在一个更通用的“如何做异步控制台应用程序”-way

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

以下是一个如何完成的示例:

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);
        }
    }
}