I'm trying to use the async HttpWebRequest
in Silverlight for Windows Phone. All works perfect until I get to the where I should call
private static ManualResetEvent allDone = new ManualResetEvent(false);
...
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
allDone.WaitOne();
Debug.WriteLine("All done!");
In GetResponseCallback
:
private void GetResponseCallback(IAsyncResult asynchronousResult)
{
try
{
request = (HttpWebRequest)asynchronousResult.AsyncState;
response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
allDone.Set();
}
catch (Exception e)
{
Debug.WriteLine("Got Exception in GetResponseCallback: " + e.Message);
}
}
After the call to allDone.WaitOne();
it just hangs...
Any suggestions on why?
This just takes a bit of a shift in thinking away from blocking/waiting to thinking in async terms on the WP7 platform. The result is the user is always able to interact with the UI.
Move a call to your completion code (writeline in this case) into your CompletedEventHandler and for any UI updates marshall back to the UI thread with
Dispatcher.BeginInvoke( () => { /* your UI update code */ } )
If there are any UI elements that should not be interacted with while your async op is executing then these controls can be hidden or disabled for the interim.