WebRequest.BeingGetResponse и IAsyncResult.AsyncWaitHandle не работают - PullRequest
1 голос
/ 23 октября 2010

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?

1 Ответ

0 голосов
/ 23 октября 2010

Вы используете этот WaitHandle для ожидания этого запроса для получения ответа.Когда WaitHandle получает сигнал, вы знаете, что ответ получен, а затем вы вызываете EndGetResponse, чтобы получить ответ.

...