Я пытаюсь написать код, который будет вызывать вызов веб-службы на несколько разных серверов параллельно, поэтому TPL кажется очевидным выбором для использования.
Только один из моих вызовов веб-сервисов всегда вернет результат, который я хочу, и все остальные не будут. Я пытаюсь разработать способ эффективного использования 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, т.е. не было соответствия.