2010-10-22 1 views
1

WebRequest.BeginGetResponse возвращает IAsyncResult, который имеет член AsyncWaitHandle. Первоначально я думал, что могу просто ждать этого в инициирующем коде. Но оказывается, что событие сигнализируется сразу же после запроса и до, а не после вызова EndGetResponse. Это кажется мне неинтуитивным, но что угодно.WebRequest.BeingGetResponse и IAsyncResult.AsyncWaitHandle не работает

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

ответ

0

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

+0

Спасибо, но вопрос в том, как использовать ThreadPool.RegisterWaitForSingleObject против простого ManualResetEvent, чтобы дождаться завершения async op. –

+0

Я просто отреагировал на это: Но оказывается, что событие сигнализируется сразу же после запроса и до, а не после вызова EndGetResponse. Это кажется мне неинтуитивным, но что угодно. – Onkelborg

+0

Я хочу, чтобы кто-то из Microsoft объяснил, ПОЧЕМУ IAsyncResult.ASyncWaitHandle сигнализируется до того, как ответ готов ... –