如何创建异步/等待控制台应用程序c#时钟

如何创建异步/等待控制台应用程序c#时钟,c#,async-await,real-time-clock,C#,Async Await,Real Time Clock,我不熟悉async/await,我尝试创建一个响应时钟作为演示。时钟工作正常,但当我试图让它进入异步功能并等待延迟时,它停止工作,只显示它运行的时间。代码如下: 公共静态异步无效时钟() { while(true) { Console.WriteLine(DateTime.Now.ToString()); 等待任务。延迟(1000); Console.Clear(); } } 主要是: clock() 编辑: 应用程序似乎没有通过等待任务的阶段运行。延迟(1000)这让我相信有无限的延迟,可能

我不熟悉
async/await
,我尝试创建一个响应时钟作为演示。时钟工作正常,但当我试图让它进入异步功能并等待延迟时,它停止工作,只显示它运行的时间。代码如下:

公共静态异步无效时钟()
{
while(true)
{
Console.WriteLine(DateTime.Now.ToString());
等待任务。延迟(1000);
Console.Clear();
}
}
主要是:

clock()

编辑: 应用程序似乎没有通过
等待任务的阶段运行。延迟(1000)
这让我相信有无限的延迟,可能是因为
等待
。但据我所知,从逻辑上讲,这是不应该发生的,我也看到过一些在延迟时使用
await
的例子,所以这一定是可能的。

通过从
Main
调用
clock()

您可以使
clock()
返回一个
Task
并使用
clock().Wait()
block
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
或者更可能是:

Main 1
DoSomethingAsync 1
Main 2
Main 1
Main 2
DoSomethingAsync 1
通过从
Main
调用
clock()
可以启动异步任务,而无需等待它完成

您可以使
clock()
返回一个
Task
并使用
clock().Wait()
block
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
或者更可能是:

Main 1
DoSomethingAsync 1
Main 2
Main 1
Main 2
DoSomethingAsync 1

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

第二,如果只想使时钟方法同步,则不建议使用使其静态。因为它会阻止整个类的执行。 请参阅此以了解更多信息

现在关于实施。因为我们将时钟()作为一个同步的非静态方法。我们需要在main方法中创建类的对象,并调用
clock()

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

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

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

第二,如果只想使时钟方法同步,则不建议使用使其静态。因为它会阻止整个类的执行。 请参阅此以了解更多信息

现在关于实施。因为我们将时钟()作为一个同步的非静态方法。我们需要在main方法中创建类的对象,并调用
clock()

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

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

静态对异步/同步行为没有影响。它不会“阻碍整个班级”。您提到的链接是针对Java的,它的synchronized conceptStatic对异步/同步行为没有影响。它不会“阻碍整个班级”。您提到的链接是针对Java及其同步概念的