【问题标题】:Task.Delay() does not delayTask.Delay() 不延迟
【发布时间】:2017-11-07 11:08:19
【问题描述】:

尝试在下面的示例中理解 async/await:

public static Task <string> job()
{
    Console.WriteLine("start delay 1");
    Task.Delay(2000);
    Console.WriteLine("sleep done 1");
    Task<string> t =  new Task<string>(()=> {
        Console.WriteLine("start delay 2");
        Task.Delay(3000);
        Console.WriteLine("sleep done 2");
        return "aaaa"; }) ;
    t.Start();
    return t;

}



public async static void caller()
{
    string s = await job();
    Console.WriteLine("result is {0}", s);

}



public static void Main()
{

    caller();
    Console.WriteLine("done with caller");
    Console.ReadLine();
}

为了获得更清晰的画面,我想让任务运行的时间更长一些,并且我添加了 Task.Delay()。两次延迟都不需要时间并立即完成。为什么?如何让我的任务花一些时间在简单的工作上以使其持续更长时间?

【问题讨论】:

  • 你必须 await Task.Delay(ms) (注意你必须让 job() async 正如@stuartd 所说的那样才能工作)
  • job() 也应该标记为async
  • 看看documentation 和那里的代码示例

标签: c#


【解决方案1】:

Task.Delay 创建一个延迟指定时间的任务。您确实生成了一个延迟 2 秒的任务,但您从不等待它。

在通话中添加await 确实可以解决此问题。 (你要标记方法async

public static async Task <string> job()
{
    ...
    await Task.Delay(2000);
    ...
}

你可以阅读更多关于异步编程here

【讨论】:

    【解决方案2】:

    Task.Delay 会返回一个任务,该任务将在您提供的给定毫秒内完成。要在这一点上保持代码的执行(这是对其所做工作的大规模简化,您肯定应该对 c# 中的 async/await 进行更多学习),您需要像这样等待对 Task.Delay(2000) 的调用

    await Task.Delay(2000);
    

    要使用 await 关键字,您需要像这样将方法签名标记为异步

    public static async Task<string> job()
    

    但我强烈建议阅读 async 和 await

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 2021-02-14
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多