为什么我的任务只起作用一次
本文关键字:一次 起作用 我的 任务 为什么 | 更新日期: 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);
}
}
}