C# 等待延迟不起作用



我想暂停程序,这样它就不会关闭。我有一个在主线程中运行的代码。尝试了这种方式,但此代码立即跳过,程序关闭而不是等待。

如何让它等待 WaitMy 方法完成?

static void Main(string[] args)
{
//any code here...
Console.WriteLine("Discovery started");
WaitMy();
}
private async static void WaitMy()
{
//await Task.Delay(30 * 1000);
await Task.Run(async () => await Task.Delay(30 * 1000));
}

应用程序使用 .net 4.5 运行。

将代码更改为以下内容以使其正常工作:

static async Task Main(string[] args)
{
//any code here...
Console.WriteLine("Discovery started");
await WaitMy();
}

这是如何工作的?

  1. 您需要 C# 7.1 或更高版本
  2. 现在 Main 方法可以声明为异步,并将返回类型作为引入awaitTask
  3. 它只会让延迟异步执行,但会重新输入主上下文以进行继续,这不会退出

另一个建议是,您只需要await Task.Delay(30 * 1000),这里不需要包装在Task.Run

您正在使用任务编程库。这里发生的情况是,在您的WaitMy方法中,您正在计划要执行的任务(await Task.Run(...)(。任务正在后台线程上执行。 同时,Main 方法在调用WaitMy方法后继续执行。 Main 方法紧随其后结束,因此前台线程将终止,与其进程关联的所有后台线程也将终止。 如果您只想执行延迟,只需使用:

System.Threading.Thread.Sleep(30 * 1000);

在 Main 方法中,而不是调用 WaitMy。

方法WaitMy可以返回Task实例,以便您可以让主线程等待它完成。

static void Main(string[] args)
{
//any code here...
Console.WriteLine("Discovery started");
var task = WaitMy();
task.Wait();
Console.WriteLine("And done :)");
}
private static Task WaitMy()
{
//await Task.Delay(30 * 1000);
return Task.Run(async () => await Task.Delay(30 * 1000));
}

如果您只是希望程序在终止之前等待一个简单的答案,请使用

Console.ReadKey();

如果您好奇为什么程序在没有等待的情况下终止,那是因为您使用Task.Run将等待委托给 ThreadPool,因此等待发生在另一个线程上,您的应用程序只是在从 ThreadPool 接收任何结果之前终止

最新更新