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)
一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...
随机推荐
- ORACLE-DataGuard-重启服务器的方法
DG原理:主机向备机传送日志文件,备机执行日志文件,借此与主机数据同步. 依此原理,不难推导出DG的开关机顺序 关机顺序 先主机再备机,这样日志就不会断了 开机顺序 先备机再主机 ,这样的目标也是日 ...
- Java:类加载器(ClassLoader)
听上去很高端,其实一般自定义类加载器不需要用户去实现解析的过程,只要负责实现获取类对应的.class字节流部分就ok了,摘录深入理解Java虚拟机的一段话 虚拟机设计团队把类加载阶段中的“通过一个类的 ...
- 再谈javascript函数节流
之前写过但是不记得在哪了,今天同事要一个滑到页面底部加载更多内容的效果,又想起了这玩意儿,确实挺实用和常用的,谨此记之. 函数节流从字面上的意思就是节约函数的执行次数,其实现的主要思想是通过定时器阻断 ...
- JSON运用——PHP中使用json数据格式定义字面量对象的方法
目前,在PHP中是不支持字面量命名法. 前端的小伙伴都知道,在JS中用字面量定义一个对象的方法可以如下: var o = { 'name' : 'Tom' , 'url' : 'www.baidu.c ...
- Django——REST framework
1. 什么是REST REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审 ...
- 移动目标在三维GIS中的实现方法
对于基于ArcGIS Runtime的应用程序,其实现方法比较简单,可以直接更新图形的Geometry属性,即可实现位置的移动: private void AddGraphics() { var gl ...
- Vue打包桌面程序
开源的地址:https://github.com/electron/electron-quick-start 一.运行 1. 安装依赖 cnpm install electron --save cnp ...
- python学习笔记之——正则表达式
1.re模块 Python通过re模块提供对正则表达式的支持,re 模块使 Python 语言拥有全部的正则表达式功能.使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用 ...
- Directly output the object name
package basic.java; public class Case { public static void main(String[] args) { Student s = new Stu ...
- notepad 操作总结
1.竖向选择 先把鼠标光标放在起始位置,然后同时按 Alt+Ctrl 或Alt+shift键,然后移动鼠标选取内容. Word中只能用Alt+Shift .