Task.Delay()不会延迟

时间:2017-11-07 11:08:19

标签: c#

尝试在下面的示例中了解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()。两次延误都没有时间,并立即完成。为什么?如何让我的任务花一些时间在简单的工作上,以使其持续更长时间?

2 个答案:

答案 0 :(得分:1)

Task.Delay创建一个延迟指定时间的任务。你确实产生一个延迟2秒的任务,但你永远不会等待它。

在呼叫中添加await会解决此问题。 (您必须标记方法async

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

您可以阅读有关异步编程here

的更多信息

答案 1 :(得分:0)

Task.Delay返回一个任务,该任务将在您提供的给定毫秒内完成。为了在这一点上执行你的代码(这是对它的作用的大量简化,你应该在c#中对async / await进行更多的学习)你需要等待对这样的调用Task.Delay(2000)

await Task.Delay(2000);

使用你需要的await关键字将你的方法签名标记为async,如下所示

public static async Task<string> job()

但我强烈建议您阅读async并等待