【发布时间】:2015-10-21 08:23:40
【问题描述】:
我想执行一个任务列表,并在其中任何一个完成后执行一个同步操作,但我需要知道它是哪一个。
查看我的示例,并注意代码中的注释,前面有几行我不知道如何实现。
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 示例。
在我的真实世界场景中,我有一个客户列表,我必须逐个遍历他们并根据他们的信用状态更新远程服务器(远程服务器不支持批量更新)。在他们每个人都更新后,我必须在我的数据库中标记该客户已获得认可。
【问题讨论】:
-
那么,你的问题是什么?
-
你做了什么,发生了什么?
-
我认为你不能(应该?)这样做。为什么不直接
UserNames.Select(un => GreetAsync(un)).ContinueWith(...).ToList();? -
Task有一个AsyncState属性,表示它的状态对象,作为Task构造函数或ContinueWith中的第二个参数传递,但你没有使用任何一个。
标签: c# asynchronous async-await task