c# async await理解

写两个方法第一个List<int>list=newList<int>();inti=0;do{i ;list.Add(i);}while(i<10);Console.WriteLine("开始执行时间:" DateTime.Now.ToString());Parallel.ForEach(list,asyncitem=>{varresult=awaitTest...

c# async await理解

写两个方法

第一个

List<int> list = new List<int>();int i= 0;do{ i  ; list.Add(i);} while (i< 10);Console.WriteLine("开始执行时间:"DateTime.Now.ToString());Parallel.ForEach(list, async item =>{ var result = await Test(); Console.WriteLine("线程"result.ToString());});

第二个

public static async Task<string> Test(){ return await Task.Run(() =>{ Thread.Sleep(2000); Console.WriteLine("Test()方法里面线程ID: {0}", Thread.CurrentThread.ManagedThreadId); Console.WriteLine("执行时间:"DateTime.Now.ToString()); return Thread.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个线程 那么就是先第一部分 然后第二部分了

欢迎补充...

源文地址:https://www.guoxiongfei.cn/cntech/19220.html
0