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 @   double64  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示