タスクのリストを実行し、いずれかのタスクが完了したら同期アクションを実行したいのですが、どのタスクであったかを知る必要があります。
私の例を参照し、コード内のコメントに注意してください。これは、達成方法がわからない数行の前にあります。
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);
}
}
私の実際のシナリオでは、顧客のリストがあり、それらを1つずつウォークスルーして、クレジットステータスでリモートサーバーを更新する必要があります(リモートサーバーはバッチ更新をサポートしていません)。それぞれが更新された後、この顧客が認定されていることをデータベースにマークする必要があります。
単純に使ってみません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);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加