我正在尝试优化此代码以减少完成 for 循环所需的时间。在这种情况下,CreateNotification() 需要很长时间,并且使用 async await 不会提高性能,因为正在等待每个异步调用。我想使用 Task.WhenAll() 来优化代码。我怎样才能做到这一点?

foreach (var notification in notificationsInput.Notifications)
{
  try
  {
    var result = await CreateNotification(notification);
    notification.Result = result;
  }
  catch (Exception exception)
  {
    notification.Result = null;
  }
  notifications.Add(notification);
}

最佳答案

您可以在要并行处理其元素的集合上调用 Select,将异步委托(delegate)传递给它。这个异步委托(delegate)将为处理的每个元素返回一个 Task,因此您可以在所有这些任务上调用 Task.WhenAll。模式是这样的:

var tasks = collection.Select(async (x) => await ProcessAsync(x));
await Task.WhenAll(tasks);

对于您的示例:
var tasks = notificationsInput.Notifications.Select(async (notification) =>
{
    try
    {
        var result = await CreateNotification(notification);
        notification.Result = result;
    }
    catch (Exception exception)
    {
        notification.Result = null;
    }
});
await Task.WhenAll(tasks);

这假设 CreateNotification 是线程安全的。

关于c# - 避免在 foreach 循环中等待,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50893933/

10-16 09:58