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

标签 c# async-await concurrency task task-parallel-library

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

关于c# - 推荐使用 Task.WhenAll 循环执行任务的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36723229/

相关文章:

python - 依次等待多个异步函数

android - ARM 对 Java 程序的多核惩罚

c# - 如何从 Visual Studio 调试输出窗口读取文本

c# - 使用专用表值参数的多行 SQL Server 更新 - 存储过程

c# - 我应该明确断言计数还是结果?

Java并发线程错误

java - 当 Java 小程序的多个实例写入服务器上的同一个文件时,如何避免出现错误

c# - 复杂 silverlight 游戏的最佳设计模式

javascript - 如何通过另一个异步函数内的异步函数循环遍历数组?

javascript - nodejs 异步等待流程无法正常工作