zoukankan      html  css  js  c++  java
  • C# Task.WhenAll

    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 = 0; index < tables.Length; index++)
                {
                    for (int k = 0; 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 0;
    
                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 1; }); }

    这样调用就可以了:

    var task = ExecuteDataAsync();
    task.Wait();
  • 相关阅读:
    webView的缩放效果配置
    Tips:cell的选中类型修改
    纸牌生成算法(随机数组)
    Couldn’t communicate with a helper application.
    标记:音频扬声器+听筒切换
    向企业账号内添加开发者账号
    (四期)简单添加TableViewCell的3D动画效果
    (三期)Hybrid混合开发之Appcan技术
    (二期)IOS调试技巧
    openresty(lua)调试
  • 原文地址:https://www.cnblogs.com/wybin6412/p/10691099.html
Copyright © 2011-2022 走看看