的任务.当任何ContinueWith:获取参数

本文关键字:获取 参数 ContinueWith 任何 任务 | 更新日期: 2023-09-27 18:18:32

我想执行一个任务列表,并在其中任何一个任务完成后执行同步操作,但我需要知道是哪一个任务。

查看我的示例,并注意代码中的注释,它位于我不知道如何实现的几行之前。

public async Task<bool> GreetAsync(string name)
{
  if (name == null)
    return false;
  await InternalGreeter.GreetAsync(name);
  return true;
}
public async Task GreetAllAsync()
{
  var tasks = UserNames.Select(un => GreetAsync(un)).ToList();
  while(tasks.Any())
  {
    var finished = await Task.WhenAny(tasks);
    if(finished.Result)
    {
      //Here's what I'd like to achieve
      var username = finished.Arguments[0];
      WriteLine($"User {username} has been greeted.");
    }
    tasks.Remove(finished);
  } 
}

根据本例。

在我的真实场景中,我有一个客户列表,我必须逐个浏览他们,并更新远程服务器上他们的信用状态(远程服务器不支持批量更新)。在每一个客户都被更新之后,我必须在我的数据库中标记这个客户已经被认证。

的任务.当任何ContinueWith:获取参数

你几乎不会想要一次处理一个任务列表,因为它们是这样完成的。相反,只需引入一个更高级的操作,并将Task.WhenAny重写为Task.WhenAll,以等待那些更高级的操作。

public async Task<bool> GreetAsync(string name)
{
  if (name == null)
    return false;
  await InternalGreeter.GreetAsync(name);
  return true;
}
private async Task<bool> GreetAndReportGreetedAsync(string name)
{
  var result = await GreetAsync(name);
  WriteLine($"User {name} has been greeted.");
  return result;
}
public async Task GreetAllAsync()
{
  await Task.WhenAll(UserNames.Select(un => GreetAsync(un));
}

为什么不直接使用ContinueWith呢?像这样:

public async Task GreetAllAsync(List<string> UserNames)
{
  var tasks = UserNames
    .Select(un => GreetAsync(un)
        .ContinueWith(x => {
            Console.WriteLine(un + " has been greeted");
        }));
    await Task.WhenAll(tasks);
}