我必须在批处理作业中处理大量数据
计划流程
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,
答案 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并且所有条目都相应地更新。我无法在没有看到代码的情况下跟踪列表为空的原因。