いくつかの異なるサーバーを並行してWebサービス呼び出しを行うコードを作成しようとしているので、TPLを使用するのは当然の選択のようです。
私のWebサービス呼び出しの1つだけが私が望む結果を返すことはあり、他のすべては返しません。私は、条件に一致するTask.WaitAny
最初のものが戻ったときにのみブロックを解除することを効果的に行う方法を模索しています。Task
試してみましWaitAny
たが、フィルターをどこに置くかわかりませんでした。私はここまで来ました:
public void SearchServers()
{
var servers = new[] {"server1", "server2", "server3", "server4"};
var tasks = servers
.Select(s => Task<bool>.Factory.StartNew(server => CallServer((string)server), s))
.ToArray();
Task.WaitAny(tasks); //how do I say "WaitAny where the result is true"?
//Omitted: cancel any outstanding tasks since the correct server has been found
}
private bool CallServer(string server)
{
//... make the call to the server and return the result ...
}
編集:上記の混乱がある場合に備えて、簡単に説明します。私は次のことをしようとしています:
- サーバーごとに、を開始し
Task
て確認します - いずれか、サーバーがtrueを返すまで待ちます(最大1台のサーバーのみがtrueを返します)
- または、すべてのサーバーがfalseを返すまで、つまり一致するものがなくなるまで待ちます。