一个简单的列子,需要把一个集合的数据添加到数据库中。

我先这样写了,然后报错了

     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的更多相关文章

  1. 【转】【C#】C# 5.0 新特性——Async和Await使异步编程更简单

    一.引言 在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4.0中主要的特性,然而.NET 4.5 的推出,对于C#又有了新特性的增加--就是C#5.0中async和await两个关键字,这两 ...

  2. (译)关于async与await的FAQ

    传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的API及性能提升,另外关键字”async” ...

  3. 关于async与await的FAQ 转

    (译)关于async与await的FAQ 传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的 ...

  4. 关于async和await的一些误区实例详解

    转载自 http://www.jb51.net/article/53399.htm 这篇文章主要介绍了关于async和await的一些误区实例详解,有助于更加深入的理解C#程序设计,需要的朋友可以参考 ...

  5. Promise,Async,await简介

    Promise 对象 转载:http://wiki.jikexueyuan.com/project/es6/promise.html 基本用法 ES6 原生提供了 Promise 对象.所谓 Prom ...

  6. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  7. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  8. async 和 await 之异步编程的学习

    async修改一个方法,表示其为异步方法.而await表示等待一个异步任务的执行.js方面,在es7中开始得以支持:而.net在c#5.0开始支持.本文章将分别简单介绍他们在js和.net中的基本用法 ...

  9. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

随机推荐

  1. Java 并发:线程中断-interrupt

    一直以为执行了interrupt方法就可以让线程结束,并抛出InterruptedException. 今天看了Java并发编程实战的第七章发现并不是这么回事,在这章的开头就提到 要使任务和线程能安全 ...

  2. 如何一键部署项目&&代码自动更新

    my-deploy : 由nodejs写的一个自动更新工具,理论支持所有语言(php.java.c#)的项目,支持所有git仓库(bitbucket.github等). Github 效果如何? 如果 ...

  3. 安装 Zsh 及 Oh-my-zsh

    详细介绍就略过吧,可以参考这篇文章:使用ZSH的九个理由 下面记录一下我在配置ZSH的过程中的要点: 1.基本上你能找到的配置教程都是基于oh-my-zsh的. 因为zsh配置过于复杂,所以有了oh- ...

  4. win7 远程连接服务器出现身份验证错误,且找不到加密Oracle修正

    用远程桌面连接登录服务器,结果,弹出一个错误的提示框:发生身份验证错误,要求的函数不受支持. 然后在网上找了相关的教程,基本上所有的方法都是如下所示: 策略路径:"计算机配置"-& ...

  5. group by 一条语句实现多条语句的效果

    --一个sql 使用 group by 实现 4个 sql 的效果 select ProjectNumber,ClientName,jx,sf,sum(count) as TotalCount fro ...

  6. python 3 过滤股票

    参考某个博客,代码不全,地址找不到了见谅,加了些自己弄的算法. 备忘 #-*- coding: utf-8 -*-import os, reimport time def filefilter(com ...

  7. yum 安装LAMP

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...

  8. 使用Facebook开源代码FBShimmering封装进度显示的ShimmeCircleView

    使用Facebook开源代码FBShimmering封装进度显示的ShimmeCircleView 效果图: 静态图: 源码: ShimmeCircleView.h 与 ShimmeCircleVie ...

  9. 在VisualStudio中远程调试IIS站点

        如何在本地调试服务器上的站点?   如果要在本地调试服务器上的站点我们需要用到一个远程调试工具msvsmon.exe.   我们可以再VS安装目录中找到它   如:C:\Program Fil ...

  10. 双十一问题:在洪峰数据来临的瞬间,redis出现连接超时异常

    如图所示,在大数据量来袭时,部署服务的机器中存在一台机器突然出现该报错,并且一直持续下去,直到洪峰数据结束也未恢复,重启机器后该问题解决 原因分析: 在请求redis过多时,因为未及时的释放掉redi ...