私はいくつかのコードを書くことを試みています。これは、いくつかの異なるサーバーへのWebサービス呼び出しを並行して実行するため、TPLが当然の選択肢のようです。タスク並列ライブラリ指定された結果を持つWaitAny
私の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 ...
}
編集:クイック明確化を念のために上記のいずれかの混乱があります。私は、次の操作を実行しようとしている:
- サーバーごとに、サーバーがtrueを返すまで待って、
- のいずれかを、それをチェックするために
Task
を開始(1台のサーバーの唯一最大が今までtrueを返します) - または、すべてのサーバーがfalseを返すまで待ちます。つまり、一致するものはありません。
私はあなたのコードサンプルを試してきました。私は 'WaitAny'を使うことはできません。なぜなら、サーバが正しいものではなくても、最初の' Task'が完了したときに戻ってくるからです。私も 'WaitAll'を使うことはできません。さもなければ、正しいものを見つけた後でも、すべてのタスクが完了するのを待たなければなりません。理想的には、「いずれかのタスクが真、またはすべてのタスクが完了するまで待ちます(つまり、いずれのサーバーも一致しない)」。私がそれを達成する方法はありますか? –
私は 'WaitAll'はキャンセルされた仕事でも動作すると思います。 –
私の答えは更新されましたが、今は@svickの答えが好きです。 –