推荐使用Task.WhenAll在循环中执行任务的方法
本文关键字:循环 执行任务 方法 WhenAll Task | 更新日期: 2024-10-21 08:37:39
有人能推荐我如何将Task.WhenAll应用于以下代码吗
foreach (DataRow row in sap_tickets.Rows)
{
//#EDIT This is the beginning of the task i want to execute
picklist = row["absentry"].ToString();
try
{
//call webservice here
string response = await Ut.updateFulfilment(row["order_number"].ToString());
}
catch (Exception)
{
//log error to DB
Ut.FlagOff(picklist, CommonEnums.FLAG_OFF_TYPE.ERROR.ToString());
}
//This is the end of the task i want to execute
}
编辑
我的任务由foreach循环中存在的代码组成并且它们可以安全地多次调用
如果Ut.updateFulfilment(
是线程安全的,那么它实际上非常容易。只需将foreach的主体放入异步函数中,然后将该函数传递给Select(
。将Select(
的结果传递给Task.WhenAll(
async Task YourOriginalFunction(DataTable sap_tickets)
{
//Be user System.Data.DataSetExtensions.dll is included in the project refrences
//to get AsEnumerable() to work.
var tasks = sap_tickets.AsEnumerable().Select(BodyAsync)
await Task.WhenAll(tasks);
}
async Task BodyAsync(DataRow row)
{
picklist = row["absentry"].ToString();
try
{
//call webservice here
string response = await Ut.updateFulfilment(row["order_number"].ToString());
}
catch (Exception)
{
//log error to DB
Ut.FlagOff(picklist, CommonEnums.FLAG_OFF_TYPE.ERROR.ToString());
}
}
在达到第一个await
之前,您不需要做任何"繁重的工作",因此您不需要使用Task.Run(
来获取多个线程,一旦您发出webservice请求,它将立即启动foreach
的下一个循环,而不是像以前那样等待整个方法体完成后再启动下一个环。