推荐使用 Task.WhenAll 循环执行任务的方法
Recommend way to use Task.WhenAll to execute tasks in a loop
任何人都可以推荐我如何将 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
之前你没有做任何 "heavy lifting" 所以你不需要使用 Task.Run(
来获得多个线程,一旦你发出网络服务请求它将立即开始 foreach
的下一个循环,而不是像您以前的方法那样等待整个方法主体完成后再开始下一个循环。
任何人都可以推荐我如何将 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
之前你没有做任何 "heavy lifting" 所以你不需要使用 Task.Run(
来获得多个线程,一旦你发出网络服务请求它将立即开始 foreach
的下一个循环,而不是像您以前的方法那样等待整个方法主体完成后再开始下一个循环。