C#等待延迟无法正常工作

时间:2018-05-10 11:35:00

标签: c# async-await

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

如何让它等待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运行。

3 个答案:

答案 0 :(得分:1)

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

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

    await WaitMy();
}
  

这是如何运作的?

  1. 您需要C#7.1或更高版本
  2. 现在,Main方法可以声明为async,返回类型为Task,用于引入await
  3. 它只会让延迟异步执行,但会将主要上下文用于继续,而不会退出
  4. 另一个建议是,你只需要await Task.Delay(30 * 1000),这里不需要包裹Task.Run

答案 1 :(得分:0)

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

 System.Threading.Thread.Sleep(30 * 1000);
在Main方法中

,而不是调用WaitMy。

答案 2 :(得分:-1)

如果您只是希望程序在终止简单答案之前等待

Console.ReadKey();

如果你很好奇为什么程序终止而不等待它是因为你使用Task.Run委托等待ThreadPool,所以等待发生在另一个线程上,你的应用程序只能在它从ThreadPool接收任何结果之前终止