如何创建 async/await 控制台应用程序 C# 时钟

how to create async/await console app c# clock

我是 async/await 的新手,我尝试创建一个响应式时钟作为演示。时钟工作正常,但是当我试图让它进入异步函数并等待延迟时它停止工作,只显示它 运行 的时间。这是代码:

public static async void clock ()
   {
      while (true)
         {
            Console.WriteLine(DateTime.Now.ToString());
            await Task.Delay(1000);
            Console.Clear();
         }
   }

主要是:

clock();

编辑: 应用程序似乎没有 运行 通过 await Task.Delay(1000); 这让我相信存在无限延迟,可能是因为 await。但据我所知,从逻辑上讲它不应该发生,我也看到了一些使用 await on delay 的例子,所以它一定是可以做到的。

通过从 Main 调用 clock(),您将启动一个异步任务,而无需等待它完成。

您可以将 clock() return 设为 Task 并使用 clock().Wait() 阻止 Main 方法直到任务完成(永远不会,因为clock() 包含一个无限循环,永远不会结束)。

如果没有 Wait() 等待任务完成,Main 将 运行 完成,导致应用程序关闭。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Main 1");

        DoSomethingAsync().Wait();

        Console.WriteLine("Main 2");
    }

    public static async Task DoSomethingAsync()
    {
        Console.WriteLine("DoSomethingAsync 1");

        await Task.Delay(1000);

        Console.WriteLine("DoSomethingAsync 2");
    }
}

应用程序的输出:

Main 1
DoSomethingAsync 1
(delay of 1 second)
DoSomethingAsync 2
Main 2

如果没有 Wait(),它将是:

Main 1
DoSomethingAsync 1
Main 2

或更有可能是:

Main 1
Main 2
DoSomethingAsync 1

首先是Task.Delayreturns一个Task。这是必要的,因为我们可能需要让应用程序在执行逻辑之前等待。

其次,如果只想使时钟方法同步,则​​不建议使用使其静态。因为它会阻塞整个class执行。 请参阅此以了解更多有关 synchronous static and non-static methods.

的信息

现在关于实施。因为我们正在将 clock() 作为同步非静态方法。我们需要在main方法中创建class的对象并调用clock().

    Program p = new Program();
    p.clock();

我们可以使用Task.Run()创建一个新线程。

    public Task clock()
    {
        while (true)
        {
            Console.WriteLine(DateTime.Now.ToString());
            Task.Run(() => Task.Delay(1000));
            Console.Clear();
        }
    }