c# async await 理解 结合并行处理

摘要:
在Task对象前面用await会阻塞线程,直到Task中的异步操作结束。程序才会继续执行。

写两个方法

第一个

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();
      });
}

c# async await 理解 结合并行处理第1张

可以区分来看

Test() 是一个部分

await Test()又是一部分

这两部分运行的位置不一样,第一部分就跟我们平时调用一样,在当前线程直接执行,第二部分的执行取决于我们await的对象,执行的位置也在await对象内部。

这样子不太好看

c# async await 理解 结合并行处理第2张

主线程碰到await后会立刻返回,以非阻塞的形式执行后面的代码。

在Task对象前面用 await会阻塞线程,直到Task中的异步操作结束。程序才会继续执行。(也就是第二部分里面的r的方法对象是阻塞的,只有运行完才会继续执行)

附上运行图

第一次

c# async await 理解 结合并行处理第3张

第二次

c# async await 理解 结合并行处理第4张

可能觉得看的有点迷茫

我们改一下代码Console.WriteLine("Test()方法里面线程ID: {0},时间:{1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString());

第三次执行

c# async await 理解 结合并行处理第5张

发现在执行第二部分的时候,存在不是同步的情况

理论上第二部分是同步的

这里出现异步的情况是因为并行

我同时执行了10个线程

然后每个线程都执行第一部分 然后在执行第二部分

如果仅仅只是执行1个线程 那么就是先第一部分 然后第二部分了

欢迎补充...

免责声明:文章转载自《c# async await 理解 结合并行处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在平台中使用JNDI 数据源BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

实现一个双缓冲队列

在生产者-消费者模式中,我们常常会使用到队列,这个队列在多个线程共享访问时存在互斥和竞争操作, 意味着每次访问都要加锁。如何更好的如何减少锁竞争次数呢 ?今天要介绍的双缓冲队列就是个不错的选择。 双缓冲队列就是冲着同步/互斥的开销来的。我们知道,在多个线程并发访问同一个资源的时候,需要特别注意线程的同步问题。稍稍不注意,噢货,程序结果不正确了。 原理 直...

springboot(十九)-线程池的使用

我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行。 话不多说,编码开始: 1.创建springboot工程 创建一个springboot的web工程threadpooldemoserver,pom.xml内容如下: <project xmln...

windows程序调试

调试策略 第一章 调试的过程 1. 成功而高效的调试的关键是找到准确的错误信息 2. 一旦找到一个错误,就可能找到更多。类似的代码可能还有类似的错误 3. 从错误中学习如何预防将来会产生的错误 4. 对于新代码,根本不需要执行测试来判断它是否有错误 第二章 编写便于调试的C++代码 C++语言和编程风格 1. 在需要的时候使用语言的高级特性 2. 要写出能...

python中多线程,多进程,多协程概念及编程上的应用

1, 多线程  线程是进程的一个实体,是CPU进行调度的最小单位,他是比进程更小能独立运行的基本单位。  线程基本不拥有系统资源,只占用一点运行中的资源(如程序计数器,一组寄存器和栈),但是它可以与同属于一个进程的其他线程共享全部的资源。  提高程序的运行速率,上下文切换快,开销比较少,但是不够稳定,容易丢失数据,形成死锁。 直接上代码: impor...

LeetCode——多线程问题汇总

目录 Semaphore(信号量) Lock(管程模型) 无锁(可以用有锁的也可以用无锁解决) CountDownLatch(计数器) CyclicBarrier(循环栅栏) 题目举例 把并发调用变成按顺序调用按序打印 把并发调用变成交替调用交替打印FooBar 把并发调用变成按特定规律顺序调用打印零与奇偶数 把并发调用变成按特定规律顺...

Web Worker 使用教程

Web Worker 使用教程 一、概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带来很大的不便,无法充分发挥计算机的计算能力。 Web Worker 的作用,就是为 JavaScript 创造多...