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