gpt4 book ai didi

c# - Task.WhenAny ContinueWith : Get argument?

转载 作者:行者123 更新时间:2023-11-30 14:51:53 25 4
gpt4 key购买 nike

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

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

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

关于c# - Task.WhenAny ContinueWith : Get argument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33248844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com