2010-10-22 9 views
1

WebRequest.BeginGetResponse renvoie IAsyncResult, qui a un membre AsyncWaitHandle. Initialement, je pensais que je pouvais juste attendre dans le code initiateur. Mais il s'avère que l'événement est signalé dès que la demande est faite et avant et non après l'appel de EndGetResponse. Cela semble non intuitif pour moi mais peu importe. Donc, j'ai cherché quelques exemples là-bas et il semble y avoir deux façons de s'y prendre. Il suffit de créer un ManualResetEvent et de le passer en tant qu'état utilisateur afin que je puisse le définir après le rappel EndGetResponse.WebRequest.BeingGetResponse et IAsyncResult.AsyncWaitHandle ne fonctionnent pas

L'autre consiste à utiliser ThreadPool.RegisterWaitForSingleObject. Quelque chose comme:

ManualResetEvent waitHandle = new ManualResetEvent(false); 

ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, 
    new WaitOrTimerCallback((s, t) => { waitHandle.Set(); }), null, -1, true); 

waitHandle.WaitOne(); 

Cela fonctionne même si moche. Et en regardant la documentation MSDN pour BeginGetResponse, c'est ainsi que l'exemple de code le fait. Ma question est, passant dans un ManualResetEvent en tant qu'état utilisateur, semble être beaucoup plus simple pour moi. Quel est le bénéfice de ThreadPool.RegisterWaitforSingleObject?

Répondre

0

Vous utilisez ce WaitHandle pour attendre cette demande pour obtenir une réponse. Lorsque le WaitHandle reçoit un signal, vous savez qu'une réponse est arrivée, puis vous appelez EndGetResponse pour obtenir la réponse.

+0

Merci - mais la question concerne vraiment l'utilisation de ThreadPool.RegisterWaitForSingleObject par rapport à ManualResetEvent simple pour attendre la fin de l'opération asynchrone. –

+0

Je viens de réagir à ceci: Mais il s'avère que l'événement est signalé dès que la demande est faite et avant et non après l'appel de EndGetResponse. Cela semble non intuitif pour moi mais peu importe. – Onkelborg

+0

Je souhaite que quelqu'un de Microsoft m'explique pourquoi le IAsyncResult.ASyncWaitHandle est signalé avant que la réponse ne soit prête ... –

Questions connexes