.net 异步自我理解

    多线程用的比较多,知道线程之间存在着并发冲突,共享资源需要锁。异步编程到底要不要锁,这个问题时不时就会困扰一下,索性在糊涂之前写个小段子。

    话说两口子男A,女B就是线程池里的2个线程Thread,每天有很多家务Task要做:

  1. 接孩子;
  2. 辅导孩子做功课;
  3. 烧热水;
  4. 做饭;
  5. ...

    没事的时候就看手机。

    某天,下班回家,

  • A接孩子去了,B开始做饭,此时A,B都是占用状态;
  • A到家后开始辅导孩子做功课;
  • A中间要上厕所,辅导功课的进度被记录在上下文中;
  • 如果一定要A继续辅导功课,那么就要ConfigureAwait(true),等A上完厕所继续(前面的上下文)辅导;
  • 辅导完功课A开始看手机;
  • B做完饭开始烧水,此时如果B一直看着水壶把水烧开就比较傻了,因为水开了会响(IO回调);
  • 水开了A、B谁去关开关?这是不确定的,也就是说热水壶开关是共享变量,不是被一个线程独占,但也不存在并发,因为A、B同时只会有一个在操作;
  • 到了晚上,有件事需要两人一块做,那就要Task.Run了。

2021-02-26 更新

  分别看了b站一系列视频和微软官方几篇文档,结合stackoverflow的帖子,其中有个回答提到:

”Using the Thread Pool Context does not mean that continuations are run in parallel. Using await before and within the while loop ensures that the code (continuations) are run sequentially so no need to lock in this case. “

  翻译过来就是:使用线程池上下文(await Task的默认行为)不意味着await后面要接着执行的部分是并发的,题主代码里while循环的递归调用能够保证是顺序执行,无需锁。

  初步结论:在非多线程(Task.Run())的情况下,无论有多少次await,占用的线程仍然不超过1个,也就不存在并发问题,不需要锁

猜你喜欢

转载自blog.csdn.net/xhydongda/article/details/112622351
今日推荐