如何创建 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.Delay
returns一个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();
}
}
我是 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.Delay
returns一个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();
}
}