C# Task.Delay 简单测试

class TaskDelayTest
{
    Stopwatch sw = new Stopwatch();

    public void DoRun()
    {
        Console.WriteLine($"Caller:Before call.");
        ShowDelayAsync();
        //ShowDelay();
        Console.WriteLine($"Caller:After call.");
    }
    private async void ShowDelayAsync()
    {
        sw.Start();
        Console.WriteLine($"    延时前:{sw.ElapsedMilliseconds}");
        await Task.Delay(1000); // 不会阻塞当前线程
        Console.WriteLine($"    延时后:{sw.ElapsedMilliseconds}");
    }

    private async void ShowDelay()
    {
        sw.Start();
        Console.WriteLine($"    延时前:{sw.ElapsedMilliseconds}");
        await Task.Run(()=> Thread.Sleep(1000)); 
        Console.WriteLine($"    延时后:{sw.ElapsedMilliseconds}");
    }
}

class Program
{
    static void Main()
    {
        TaskDelayTest test = new TaskDelayTest();
        test.DoRun();

        Console.ReadKey();
    }
}

输出:

ShowDelayAsync(); ShowDelay(); 这两个函数的输出顺序效果是一样的。 可以理解为 Task.Delay(1000) 等于 Task.Run(()=> Thread.Sleep(1000))

Caller:Before call.
    延时前:0
Caller:After call.
    延时后:1027

如果阻塞线程,输出顺序应该是(函数调用完返回后,顺序输出):

Caller:Before call.
    延时前:0
    延时后:1001
Caller:After call.




参考:

《图解教程》

posted @ 2022-10-21 17:41  double64  阅读(193)  评论(0)    收藏  举报