C# 任务。何时继续:获取参数?

C# 任务。何时继续:获取参数?,c#,asynchronous,async-await,task,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 Tas

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

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

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);
  } 
}
public异步任务GreetAsync(字符串名称)
{
if(name==null)
返回false;
wait InternalGreeter.GreetAsync(名称);
返回true;
}
公共异步任务GreetalAsync()
{
var tasks=UserNames.Select(un=>GreetAsync(un)).ToList();
while(tasks.Any())
{
var finished=等待任务。wheny(任务);
如果(完成。结果)
{
//以下是我想要实现的目标
var username=finished.Arguments[0];
WriteLine($“已向用户{username}打招呼。”);
}
任务。删除(已完成);
} 
}
基于实例


在我的现实世界场景中,我有一个客户列表,我必须一个接一个地浏览这些客户,并更新远程服务器的信用状态(远程服务器不支持批量更新)。在每个任务都更新之后,我必须在数据库中标记该客户已获得认证。

您几乎不希望在任务完成时一次处理一个任务列表。相反,只需引入一个更高级别的操作,并将您的
任务重写。WhenAny
任务。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));
}
public异步任务GreetAsync(字符串名称)
{
if(name==null)
返回false;
wait InternalGreeter.GreetAsync(名称);
返回true;
}
专用异步任务GreetAndReportGreetedAsync(字符串名称)
{
var结果=等待GreetAsync(名称);
WriteLine($“欢迎用户{name}”);
返回结果;
}
公共异步任务GreetalAsync()
{
wait 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);
}
public async任务GreetAllAsync(列出用户名)
{
var tasks=用户名
.Select(un=>GreetAsync(un)
.ContinueWith(x=>{
Console.WriteLine(un+“已被问候”);
}));
等待任务。何时(任务);
}

那么,你的问题是什么?你做了什么?发生了什么?我认为你不能(应该?)这样做。为什么不直接使用
用户名。选择(un=>GreetAsync(un))。继续使用(…).ToList()
任务
有一个表示其状态对象的
异步
属性,作为
任务
构造函数或
ContinueWith
中的第二个参数传递,但您不使用这两个属性。
GreetAndGreetAsync
是否可以是lambda表达式,或者有没有更好的方法不需要专用的ed方法?顺便说一句,我已经更新了我的问题。@Shimmy:当然,任何方法都可以是lambda表达式。我不认为它“更好”,但如果您愿意的话:
wait Task.WhenAll(UserNames.Select(async un=>{if(wait GreetAsync(un))WriteLine($“User{un}已经被问候过。”);};