.Net 异步与同步

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/

作者:androllen

出处:https://www.cnblogs.com/androllen/p/18746671

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   androllen  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示