Shi*_*mmy 3 c# asynchronous task async-await
我想执行一个任务列表,并在完成任何任务后执行同步操作,但我需要知道它们中的哪一个.
看看我的例子,并注意代码中的注释,这些注释位于我不知道如何实现的几行之前.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
基于这个例子.
在我的真实世界场景中,我有一个客户列表,我必须逐个走过它们并更新远程服务器的信用状态(远程服务器不支持批量更新).在每个更新后,我必须在我的数据库中标记该客户已获得认证.
你几乎从不想实际处理一个任务列表,因为它们完成了这样的任务.相反,只需引入更高级别的操作并将其重写Task.WhenAny为a 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));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |