Мне нужно сделать несколько асинхронных вызовов изнутри службы wcf, размещенной в IIS (может быть, это актуально, я не знаю). Звонки в другие сервисы, но я делаю их, помещая строку в URL сервиса. Вызов их синхронно работает, но у меня более десятка вызовов, и они полностью независимы, поэтому я хотел бы ускорить их, вызывая их асинхронно.
Теперь я понимаю, что я мог бы просто использовать несколько потоков для этого - и это могло бы быть самым простым решением - но я решил попробовать async.
Мой код похож на это:
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] Вот очень близкий вопрос - Как вызвать асинхронную операцию как синхронизацию? - но мне нужно подождать нескольких асинхронных операций.