C#Async Foreach循环用于大量数据

时间:2016-12-15 21:29:52

标签: c# .net async-await parallel.foreach

我必须在批处理作业中处理大量数据

计划流程

var inputDataLst = contextObj.GetData(); //More that 10000 rows I will retrieve

foreach(var item in inpDataLst)
{
     //logic
}

Call context.SaveMethod(inpuDataLst);

我正在尝试做类似

的事情
var tsklst = inputDataLst.Select(async pItem => 
{
   //Logic
});

await Task.WhenAll(taskList);

编译器发出警告,Resharper建议我制作同步方法。

任何人都可以建议我如何处理这个问题,因为我想要有大量数据我想做异步操作..

实施@bruno建议

Parallel.ForEach(taskList, item => {
 item.StatusId = 2; //Completed
 LastUpdateUser = "Batch";
});

循环完成后,我得到taskList为NULL,

1 个答案:

答案 0 :(得分:6)

您应该使用Parallel.For。它将异步处理您的列表。

var inputDataLst = contextObj.GetData(); 


Parallel.For(0, inputDataLst.Length,
                index=> 
                {
                    //your logic, something like ProcessData(inputDataLst[index])
                });

context.SaveMethod(inpuDataLst);

您也可以使用Parallel.ForEach

Parallel.ForEach(inpuDataLst, item => { ProcessData(item) });

编辑:

根据您的编辑附加评论,我写了一个非常简单的最小工作示例:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;

namespace SO.RajGan
{
    class SomeData
    {
        public int StatusId { get; set; }
        public string LastUpdateUser { get; set; }

        public override string ToString()
        {
            return $"Last update user: {LastUpdateUser}; Status ID = {StatusId}";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var dataList = new List<SomeData>();

            for(int i = 0; i < 100000; i++)
            {
                dataList.Add(new SomeData() { StatusId = new Random(i).Next(1, 10), LastUpdateUser = $"User {i + 1}" });
            }

            Parallel.ForEach(dataList, item => 
            {
                item.LastUpdateUser = "Batch";
                item.StatusId = 2;
            });

            Debug.Assert(dataList != null);
        }
    }
}

我测试了它并且它工作,dataList不为null并且所有条目都相应地更新。我无法在没有看到代码的情况下跟踪列表为空的原因。