WebRequest.BeginGetResponse возвращает IAsyncResult, который имеет член AsyncWaitHandle.
Первоначально я думал, что я мог просто ждать этого в исходном коде. Но оказывается, что событие сигнализируется, как только запрос сделан, и до, а не после вызова EndGetResponse. Это кажется мне не интуитивным, но что угодно.
Итак, я искал несколько примеров, и, кажется, есть два способа сделать это.
Один из них - просто создать ManualResetEvent и передать его как пользовательское состояние, чтобы в обратном вызове я мог установить его после EndGetResponse.
Другой - использовать ThreadPool.RegisterWaitForSingleObject. Что-то вроде:
ManualResetEvent waitHandle = new ManualResetEvent(false);
ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle,
new WaitOrTimerCallback((s, t) => { waitHandle.Set(); }), null, -1, true);
waitHandle.WaitOne();
Это работает, даже если уродливо. И, глядя на документацию MSDN для BeginGetResponse, вот как пример кода делает это.
Мой вопрос заключается в том, что передача ManualResetEvent в качестве пользовательского состояния мне кажется намного проще. Какую пользу приносит этот ThreadPool.RegisterWaitforSingleObject?