Task.WhenAny ContinueWith:获取参数?
Task.WhenAny ContinueWith: Get argument?
我想执行一系列任务,并在其中任何一项完成后执行同步操作,但我需要知道是哪一项。
查看我的示例,并注意代码中的注释,它位于我不知道如何实现的几行之前。
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 示例。
在我的真实场景中,我有一个客户列表,我必须逐一检查他们并根据他们的信用状态更新远程服务器(远程服务器不支持批量更新)。在他们每个人都更新后,我必须在我的数据库中标记,这个客户已经被认可。
您几乎从不想真正一次处理一个任务列表,因为它们是这样完成的。相反,只需引入更高级别的操作并将您的 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);
}
我想执行一系列任务,并在其中任何一项完成后执行同步操作,但我需要知道是哪一项。
查看我的示例,并注意代码中的注释,它位于我不知道如何实现的几行之前。
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 示例。
在我的真实场景中,我有一个客户列表,我必须逐一检查他们并根据他们的信用状态更新远程服务器(远程服务器不支持批量更新)。在他们每个人都更新后,我必须在我的数据库中标记,这个客户已经被认可。
您几乎从不想真正一次处理一个任务列表,因为它们是这样完成的。相反,只需引入更高级别的操作并将您的 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);
}