推荐使用Task.WhenAll循环执行任务的方法

问题描述 投票:0回答:1

任何人都可以推荐我如何将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 循环中存在的代码组成 他们可以安全地多次拨打电话

c# async-await concurrency task task-parallel-library
1个回答
3
投票

如果

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(
来获取多个线程,一旦您发出 Web 服务请求,它将立即启动下一个循环。
foreach
,而不是像以前那样等待整个方法体完成后再开始下一个循环。

© www.soinside.com 2019 - 2024. All rights reserved.