• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

金尘

金融策略类软件,探讨以及编写.
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

对于 《C# 彻底搞懂async/await》 一文中的观点,提出自己的修正观点。

刚接触C#搜到这篇文章,受益颇多感谢原作者,但有总结出一些不同的观点。

原文链接:《C# 彻底搞懂async/await》

目前从我自己的实验得出的结论是,这篇文章中的一些总结是错误的。

1.文章中说从 await 开始就分为2个线程执行了,这是错误的,看后面代码输出就知道了。

2.文章中说死锁的问题也是错误的,愿文章中有位读者已经回复了这个问题:“死锁不是因为await/async,而是因为ui context(winform项目)和request context(web项目),这两个上下文 SynchronizationContext.Current一次只能一个线程访问。如果换成控制台项目( SynchronizationContext.Current为null),那样写法就不会死锁。”

 

下面贴上我的实验代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Test.Main
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main Thread ID:" + Thread.CurrentThread.ManagedThreadId);

            Test ts = new Test();
            ts.DoTest();

            Console.ReadKey();
        }


    }

    public class Test
    {
        public void DoTest()
        {
            Console.WriteLine("111 Thread ID:" + Thread.CurrentThread.ManagedThreadId);
            var res = AsyncMethod();
            Console.WriteLine(res.Result);
            Console.WriteLine("222 Thread ID:" + Thread.CurrentThread.ManagedThreadId);
        }

        private async Task<string> AsyncMethod()
        {
            Console.WriteLine("AsyncMethod Thread ID:" + Thread.CurrentThread.ManagedThreadId);

            var ResultFromTimeConsumingMethod = TimeConsumingMethod();
            string Result = await ResultFromTimeConsumingMethod + " Thread ID is :" + Thread.CurrentThread.ManagedThreadId;
            Console.WriteLine(Result);
            //返回值是Task的函数可以不用return

            Result += " -------------->";

            return Result;
        }

        //这个函数就是一个耗时函数,可能是IO操作,也可能是cpu密集型工作。
        private Task<string> TimeConsumingMethod()
        {
            Console.WriteLine("TimeConsumingMethod Thread ID:" + Thread.CurrentThread.ManagedThreadId);

            var task = Task.Run(() => {
                Console.WriteLine("Before Sleep Thread ID:" + Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(2000);
                Console.WriteLine("After Sleep Thread ID :" + Thread.CurrentThread.ManagedThreadId);
                return "Finished";
            });

            return task;
        }
    }
}

再看输出结果:

 

我的结论:

1. async、await 这两个关键字主要是用来配对使用的,比如一个函数内想用 await 来阻塞等待函数执行返回,这个调用的函数就要用 async 来修饰,目前看只有这个作用。

2.实际上生成线程是这句调用: Task.Run() ,看我的测试代码,直到这句之前,所有的代码都是在主线程中执行的。

 

本人接触C#不久,用C++多一些,所以都是用C++的调试方法总结的,肯定有不妥之处,望各位C#朋友指教。

posted on 2021-06-20 22:00  金尘  阅读(443)  评论(3)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3