惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
A
About on SuperTechFans
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
Microsoft Security Blog
Microsoft Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
博客园 - Franky
D
Docker
Martin Fowler
Martin Fowler
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
U
Unit 42
F
Fortinet All Blogs
H
Help Net Security
Blog — PlanetScale
Blog — PlanetScale
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
P
Proofpoint News Feed
月光博客
月光博客
G
Google Developers Blog

博客园 - androllen

Python yield 关键词 PDF 构成 桌面客户端的主要类型和技术方案 Python 压缩转义 异步删除嵌套文件夹及文件 数据结构 二叉树遍历 数据结构 线性表 JS 字符串转换为函数体 VSCode 配置内部Python项目 缺少模块ModuleNotFoundError C# 基础知识 算法-数列 算法-排序算法 C# 设计模式-简单工厂模式 C# 设计模式 C# Utils WPF StreamGeometry Vue 打开窗口输出文件路径 CSS Flexbox layout 2 CSS Flexbox layout 1
.Net 异步与同步
androllen · 2025-03-02 · via 博客园 - androllen

namespace demoSp;

class Program
{
    static void Main(string[] args)
    {
        threadpl();
    }


    public static void threadpl()
    {
        Console.WriteLine("Async Test job:");
        Console.WriteLine("main start..");
       
        AsyncMethod(); 
      
        Console.WriteLine("MyMethod()异步方法同步执行:");

        DateTime startTime_1 = DateTime.Now;
        var startThreadId_1 = Thread.CurrentThread.ManagedThreadId;
        MyMethod().Wait(); //在main中等待async方法执行完成
        DateTime endTime_1 = DateTime.Now;
        var endThreadId_1 = Thread.CurrentThread.ManagedThreadId;
        Console.WriteLine($"startTime:{startTime_1.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId_1}\nendTime:{endTime_1.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId_1}");
        Console.WriteLine("main end...");

        DateTime startTime_2 = DateTime.Now;
        var startThreadId_2 = Thread.CurrentThread.ManagedThreadId;
        MyMethod().GetAwaiter().GetResult(); //用于在main中同步获取async方法的返回结果
        DateTime endTime_2 = DateTime.Now;
        var endThreadId_2 = Thread.CurrentThread.ManagedThreadId;
        Console.WriteLine($"startTime:{startTime_2.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId_2}\nendTime:{endTime_2.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId_2}");
        Console.WriteLine("main end..");

        Index();
        IndexAsync().Wait();

        Console.ReadKey(true);
    }

    static async Task MyMethod()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine("Async start:" + i.ToString() + "..");
            await Task.Delay(1000); //模拟耗时操作
        }
    }

    static async void AsyncMethod()
    {
        Console.WriteLine("start AsyncMethod1 async");
        DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间
        var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程ID
        await MyMethod();
        Console.WriteLine("end AsyncMethod1 async");
        DateTime endTime = DateTime.Now;//完成DoSomething方法的时间
        var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程ID
        Console.WriteLine($"AsyncMethod startTime:{startTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId}\nendTime:{endTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId}");

    }


    public static void Index()
    {
        DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间
        var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程ID

        DoSomething();//耗时操作

        DateTime endTime = DateTime.Now;//完成DoSomething方法的时间
        var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程ID
        Console.WriteLine($"startTime:{startTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId}\nendTime:{endTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId}");
    
    }

    /// <summary>
    /// 耗时操作
    /// </summary>
    /// <returns></returns>
    private static void DoSomething()
    {
        Thread.Sleep(3000);
    }

    public async static Task IndexAsync()
    {
        DateTime startTime = DateTime.Now;//进入DoSomething方法前的时间
        var startThreadId = Thread.CurrentThread.ManagedThreadId;//进入DoSomething方法前的线程ID

        await DoSomethingAsync();//耗时操作

        DateTime endTime = DateTime.Now;//完成DoSomething方法的时间
        var endThreadId = Thread.CurrentThread.ManagedThreadId;//完成DoSomething方法后的线程ID
        Console.WriteLine($"astartTime:{startTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} startThreadId:{startThreadId}\nendTime:{endTime.ToString("yyyy-MM-dd HH:mm:ss:fff")} endThreadId:{endThreadId}");
    }

    /// <summary>
    /// 耗时操作 遇到 await 就会return ,线程就会退出,剩下的代码就会抛给另一个线程去执行
    /// </summary>
    private async static Task DoSomethingAsync()
    {
        await Task.Run(() => Thread.Sleep(3000));
    }
}

   var tokenSource = new CancellationTokenSource();
   var token = tokenSource.Token;
   var task = Task.Factory.StartNew(() =>
   {
       token.ThrowIfCancellationRequested();
       Console.WriteLine("Task started ");
       Console.Read();
   });
   Console.WriteLine("Press 'Enter' key to cancel your task");
   bool issigned = token.WaitHandle.WaitOne(5000);
   tokenSource.Cancel();
   Console.Read();

参考链接:
《.NET Web应用中为什么要使用async/await异步编程》 https://www.cnblogs.com/yanglang/p/13071091.html

《C# 多线程(18):一篇文章就理解async和await》 https://www.cnblogs.com/whuanle/p/12822705.html

《异步编程》 https://docs.microsoft.com/zh-cn/dotnet/csharp/async

C#异步编程 https://edsiongithub.github.io/2021/11/08/22/