C# foreach遇到async和await
一个简单的列子,需要把一个集合的数据添加到数据库中。
我先这样写了,然后报错了
public async Task<IHttpActionResult> Test([FromUri]string name = "")
{
List<string> strList = new List<string>() { "测试", "测试1", "测试2", "测试3", "测试4", "测试5", "测试6", "测试7", "测试8" };
strList.ForEach(async x =>
{
JkSystemname jk = await dbOracle.JkSystemnames.AsQueryable().FirstAsync(ee => ee.Name == x);
if (jk == null)
{
jk = new JkSystemname() { Name = x };
dbOracle.JkSystemnames.Insert(jk);
}
});
return await Task.FromResult(Ok(new { errcode = , errmag = "success" }));
}

两个办法解决循环里面不能使用异步
①把方法提出来,然后返回task,然后一起执行,这样不会按顺序执行
public async Task<IHttpActionResult> Test([FromUri]string name = "")
{
List<string> strList = new List<string>() { "测试", "测试1", "测试2", "测试3", "测试4", "测试5", "测试6", "测试7", "测试8" };
IEnumerable<Task> tasks = strList.Select(x => TestAsync(x));//映射到一个可以遍历的task
await Task.WhenAll(tasks); //使用task.whenall 完成
return await Task.FromResult(Ok(new { errcode = , errmag = "success" }));
} /// <summary>
/// 根据传入的名称,返回需要执行的task代码
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public async Task TestAsync(string name)
{
JkSystemname jk = await dbOracle.JkSystemnames.AsQueryable().FirstAsync(ee => ee.Name == name);
if (jk == null)
{
jk = new JkSystemname() { Name = name };
dbOracle.JkSystemnames.Insert(jk);
}
}

②扩展方法,一个个的执行
/// <summary>
/// 使用异步遍历处理数据
/// </summary>
/// <typeparam name="T">需要遍历的基类</typeparam>
/// <param name="list">集合</param>
/// <param name="func">Lambda表达式</param>
/// <returns></returns>
public static async Task ForEachAsync<T>(this List<T> list, Func<T, Task> func)
{
foreach (T value in list)
{
await func(value);
}
}
public async Task<IHttpActionResult> Test([FromUri]string name = "")
{
List<string> strList = new List<string>() { "测试", "测试1", "测试2", "测试3", "测试4", "测试5", "测试6", "测试7", "测试8" };
//①先得到集合,然后一起执行
//IEnumerable<Task> tasks = strList.Select(x => TestAsync(x));//映射到一个可以遍历的task
//await Task.WhenAll(tasks); //使用task.whenall 完成
//②一步一步的循环
await strList.ForEachAsync<string>(async x =>
{
JkSystemname jk = await dbOracle.JkSystemnames.AsQueryable().FirstAsync(ee => ee.Name == x);
if (jk == null)
{
jk = new JkSystemname() { Name = x };
dbOracle.JkSystemnames.Insert(jk);
}
}); return await Task.FromResult(Ok(new { errcode = , errmag = "success" }));
}

C# foreach遇到async和await的更多相关文章
- 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单
一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两 ...
- (译)关于async与await的FAQ
传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的API及性能提升,另外关键字”async” ...
- 关于async与await的FAQ 转
(译)关于async与await的FAQ 传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的 ...
- 关于async和await的一些误区实例详解
转载自 http://www.jb51.net/article/53399.htm 这篇文章主要介绍了关于async和await的一些误区实例详解,有助于更加深入的理解C#程序设计,需要的朋友可以参考 ...
- Promise,Async,await简介
Promise 对象 转载:http://wiki.jikexueyuan.com/project/es6/promise.html 基本用法 ES6 原生提供了 Promise 对象.所谓 Prom ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- async 和 await 之异步编程的学习
async修改一个方法,表示其为异步方法.而await表示等待一个异步任务的执行.js方面,在es7中开始得以支持:而.net在c#5.0开始支持.本文章将分别简单介绍他们在js和.net中的基本用法 ...
- 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...
随机推荐
- 纯css 画气泡
我们知道运用css可以绘画出各式各样的形状:三角形,圆形,正方形,椭圆形,平行四边形等等,而通过他们之间进行两两组合可以变换出各种意想不到的效果图,气泡框就是其中一个.最简单的气泡框就是一个矩形框+一 ...
- Struts22222
一,什么是框架? 所谓框架就是提供了一组统一的接口和编程方式的可以重用组件,同时我们可以在框架中扩充我们自己的特定逻辑. 二,MVC设计模式 将应用程序分为3个部分:模型 Model,视图View, ...
- sql-(Cross||Outer)Apply
Apply - 涉及以下两个步骤中的一步或两步(取决于Apply的类型): 1.A1:把右表表达式应用于左表的行 2.A2:添加外部行 Apply运算符把右表表达式应用于左输入的每一行.右表达式可以引 ...
- arcgis 3种方法快速制作tpk文件(转)
来自:http://blog.csdn.net/arcgis_mobile/article/details/8048549 tpk是ArcGIS10.1推出的一种新的数据文件类型,主要是用于将切片文件 ...
- 什么是J2EE
什么是J2EE 一.准备篇 1 什么是J2EE?它和普通的Java有什么不同? 答:J2EE全称为Java2 Platform Enterprise Edition. "J2EE平台本质上是 ...
- Android8.0适配那点事(二)
小伙伴们,咱们今天咱继续对Android8.0的适配进行分解,今天将针对启动页,版本适配和系统限制等进行“啃食” 猛戳这里查看Android8.0适配那点事(一): 1.启动页适配 近日,我无意中发现 ...
- vue2.0中的计算属性
计算属性是一个很邪门的东西,只要在它的函数里引用了data中的某个属性,当这个属性发生变化的时候,函数仿佛可以嗅探到这个变化,并自动重新执行. 上代码会源源不断的打印出a的值.如果希望b依赖data中 ...
- malloc()函数,calloc()函数,realloc()函数,free()函数
malloc()函数 头文件:#include <stdlib.h> malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size); [参数 ...
- Redis Windows环境启动
1.找到redis安装目录 2.cmd 目录 3.输入redis-server.exe redis.windows.conf 启动成功
- CPU硬件辅助虚拟化技术
目前主要有Intel的VT-x和AMD的AMD-V这两种技术.其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式)下,且Guest O ...