Ожидание нескольких асинхронных запросов POST

Мне нужно сделать несколько асинхронных вызовов изнутри службы wcf, размещенной в IIS (может быть актуально, я не знаю). Вызовы относятся к другим службам, но я делаю их, отправляя строку в URL-адрес службы. Вызов их синхронно работает, но у меня более десятка вызовов, и они полностью независимы, поэтому я хотел бы ускорить их, вызывая их асинхронно.

Теперь я понимаю, что могу просто использовать для этого несколько потоков - и это могло бы быть самым простым решением - но я подумал, что попробую асинхронно.

Мой код похож на этот:

public delegate void Callback(string response);

public static void InvokeAsync(string request, string url, Callback callback)
  where TResponse: class
{
  var web = new WebClient();
  web.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

  web.UploadStringCompleted += (sender, e) => callback.Invoke(e.Result);
  web.UploadStringAsync(new Uri(url), request);
}

//...
var lockObj = new object();
foreach (var item in list)
  InvokeAsync(item, url, response => { lock(lockObj) newList.Add(response); });

Я считаю, что приведенное выше должно работать; однако моя проблема в том, что я не знаю, как ждать, пока не вернутся все ответы. Если я использую счетчик и жду в цикле, пока он не станет равным нулю, то выиграет ' Это будет любой процессор, оставшийся для обработки обратных вызовов. Полагаю, то же самое и с использованием некоторой формы семафора. Есть ли неблокирующий способ подождать, пока я получу все ответы? (Боюсь, изменение сигнатуры метода, чтобы она также принимала обратный вызов, переместит проблему только на один уровень вверх.)

[Edit] Вот очень близкий вопрос - Как вызвать асинхронную операцию как синхронизацию? - но мне нужно подождать нескольких асинхронных операций.

6
задан Community 23 May 2017 в 10:26
поделиться