用于大量数据的 C# 异步 Foreach 循环

C# Async Foreach loop for huge volume of data

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

程序流程

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,

您应该为此使用 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 不为空并且所有条目都相应更新。在没有看到代码的情况下,我无法追踪您的列表为空的原因。