1、有时候我们需要同时执行一些操作,然后把这些操作的结果进行汇总,以达到用异步处理降低操作耗时的效果,此时我们会考虑使用Task,而Task.WhenAll则排上了用场。

public void IssueStatistics()
{
          var task = GetIssueStatisticsAsync();
var dtRet = task.Result;
}
 private async Task<DataTable> GetIssueStatisticsAsync()
{
var taskList = new List<Task<DataTable>>
{
GetIssueDataAsync(),
GetB2CIssueDataAsync()
}; var tasks = taskList.ToArray();
var tables = await Task.WhenAll(tasks).ConfigureAwait(false); var retDt = orderDAL.CreateIssueDataTable();
for (int index = ; index < tables.Length; index++)
{
for (int k = ; k < tables[index].Rows.Count; k++)
{
retDt.ImportRow(tables[index].Rows[k]);
}
}
return retDt;
} private Task<DataTable> GetIssueDataAsync()
{
return Task.Run(() =>
{
var dt = orderDAL.GetIssueDataOfOrder();
return dt;
});
} private Task<DataTable> GetB2CIssueDataAsync()
{
return Task.Run(() =>
{
var dt = orderDAL.GetIssueDataOfB2C();
return dt;
});
}

这里有个地方需要注意的,如果不是在控制台应用程序,那么需要在Task.WhenAll后面加 ConfigureAwait(false),不然无法返回当前线程。

当然,按照官网的实例写法,你也可以这样写:

private async Task<int> ExecuteDataAsync()
{
var dtRecord = _dao.GetDataOfStockOut();
var dataList = _comDao.ToSyncDataList(dtRecord);
if (dataList == null) return ; var tasksQuery = from data in dataList select DoRunIssueDataAsync(data);
var tasks = tasksQuery.ToArray(); int[] flags = await Task.WhenAll(tasks);
int total = flags.Sum();
return total;
} private async Task<int> DoRunIssueDataAsync(SyncDataM data)
{
return await Task.Run(() =>
{
//要处理的事情
         return ;
});
}

这样调用就可以了:

var task = ExecuteDataAsync();
task.Wait();

C# Task.WhenAll的更多相关文章

  1. 捕获Task.WhenALl返回的Task的Exception

    如果有一个任务抛出异常,则Task.WhenAll 会出错,并把这个异常放在返回的Task 中.如果多个任务抛出异常,则这些异常都会放在返回的Task 中.但是,如果这个Task 在被await 调用 ...

  2. Task CancellationTokenSource和Task.WhenAll的应用

    Task是.net4.0推出的异步编程类,与ThreadPool.QueneUserWorkItem方法类似的是,Task也是使用线程池来工作的.但Task比起这个QueneUserWorkItem的 ...

  3. 写了个 Task.WhenAll(t)的一个例子。

    public static void Main() { var t = Task.Run(() => { throw new Exception("aa"); }); Tas ...

  4. C# Task WhenAny和WhenAll 以及TaskFactory 的ContinueWhenAny和ContinueWhenAll的实现

    个人感觉Task 的WaitAny和WhenAny以及TaskFactory 的ContinueWhenAny有相似的地方,而WaitAll和WhenAll以及TaskFactory 的Continu ...

  5. 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  6. 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)

    Task - 基于线程池的任务(在 System.Threading.Tasks 命名空间下) 多 Task 的并行执行 Parallel - 并行计算(在 System.Threading.Task ...

  7. C#~异步编程再续~大叔所理解的并行编程(Task&Parallel)

    返回目录 并行这个概念出自.net4.5,它被封装在System.Threading.Tasks命名空间里,主要提供一些线程,异步的方法,或者说它是对之前Thread进行的二次封装,为的是让开发人员更 ...

  8. 实践基于Task的异步模式

    Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...

  9. 基于Task的异步模式的定义

    返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...

随机推荐

  1. OpenTK学习笔记(2)-工作窗口的三种方法创建方法(winfrom窗体控件形式创建)

    参考资料: https://social.msdn.microsoft.com/Forums/zh-TW/1b781685-c670-4338-953d-1957a8f24a66/opentkglco ...

  2. Sentinel控制台前端开发环境搭建

    Sentinel:分布式系统的流量防卫兵. 官网:https://sentinelguard.io Github:https://github.com/alibaba/sentinel Wiki:ht ...

  3. osg fbx遍历模型节点名称

    ; k<sg->getNumChildren(); k++) { //转换编 std::string name = vcfbx1.w2m1(vcfbx1.m2w1(sg->getCh ...

  4. python检测文件的MD值

    使用hashlib模块,可对文件MD5一致性加密验证: #python 检测文件MD5值 #python version 2.6 import hashlib import os,sys #简单的测试 ...

  5. vue-cli 引入stylus报错

    在App.vue页面添加以下代码报错: <style lang="stylus" rel="stylesheet/stylus"> </sty ...

  6. Redis高级功能 - 慢查询日志

    转自 https://segmentfault.com/a/1190000009915519

  7. DB2中的NVL和NVL2函数

    NVL函数是一个空值转换函数 NVL(表达式1,表达式2) 如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值. 该函数的目的是把一个空值(null)转换成一个实际的值.其表达式的值 ...

  8. charles 批量重复请求/重复发包工具

    本文参考:charles 批量请求 重复发包工具/repeat Charles 让你选择一个请求并重复,在测试后端接口的时候非常有用: Charles将请求重新发送到服务器,并将响应显示为新请求. 如 ...

  9. VSCode 查看、还原本地代码历史版本

    参考链接:https://blog.csdn.net/luckystar_99/article/details/100583141

  10. eNSP——ACL基础设置

    原理: 实验案例: 拓补图: 实验编址: 1.基础设置 根据实验编址进行基础设置,并检测直连链路的连通性. 2.搭建OSPF网络 在所有路由器运行OSPF协议,通告相应网段到区域0. 在上一个随笔有详 ...