写两个方法
第一个
List list =newList();inti=0;do{ i++; list.Add(i);}while(i<10);Console.WriteLine("开始执行时间:"+DateTime.Now.ToString());Parallel.ForEach(list,asyncitem =>{varresult =awaitTest(); Console.WriteLine("线程"+ result.ToString());});
第二个
publicstaticasyncTask Test(){returnawaitTask.Run(() => { Thread.Sleep(2000); Console.WriteLine("Test()方法里面线程ID: {0}", Thread.CurrentThread.ManagedThreadId); Console.WriteLine("执行时间:"+ DateTime.Now.ToString());returnThread.CurrentThread.ManagedThreadId.ToString(); });}
可以区分来看
Test() 是一个部分
await Test()又是一部分
这两部分运行的位置不一样,第一部分就跟我们平时调用一样,在当前线程直接执行,第二部分的执行取决于我们await的对象,执行的位置也在await对象内部。
可能这样子不太好看
主线程碰到await后会立刻返回,以非阻塞的形式执行后面的代码。
在Task对象前面用 await会阻塞线程,直到Task中的异步操作结束。程序才会继续执行。(也就是第二部分里面的r的方法对象是阻塞的,只有运行完才会继续执行)
附上运行图
第一次
第二次
可能觉得看的有点迷茫
我们改一下代码 Console.WriteLine("Test()方法里面线程ID: {0},时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString());
第三次执行
发现在执行第二部分的时候,存在不是同步的情况
其实理论上第二部分是同步的
这里出现异步的情况是因为并行
我同时执行了10个线程
然后每个线程都执行第一部分 然后在执行第二部分
如果仅仅只是执行1个线程 那么就是先第一部分 然后第二部分了
欢迎补充...
看我主页简介免费C++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具
每晚8点直播讲解C++编程技术。非常感谢大家的关注,让小编更有动力写文。比心。