Task.WhenAny ContinueWith:获取参数?

时间:2015-10-21 00:05:34

标签: c# asynchronous async-await task

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

请参阅我的示例,并注意代码中的注释,该注释位于我不知道如何实现的几行之前。

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);
  } 
}

基于this示例。

在我的真实场景中,我有一个客户列表,我必须逐个走过它们并更新远程服务器的信用状态(远程服务器不支持批量更新)。在每个更新后,我必须在我的数据库中标记该客户已获得认证。

2 个答案:

答案 0 :(得分:6)

你几乎从不想实际处理一个任务列表,因为它们完成了这样的任务。相反,只需引入更高级别的操作并将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));
}

答案 1 :(得分:-1)

为什么不简单地使用[HttpPost] public ActionResult Create(Tour tour) { try { db.Tours.Add(tour); db.SaveChanges(); return RedirectToAction("Index"); } catch { return View(); } } ?像这样:

SaveChanges