Andrew Harry
Andrew Harry

Reputation: 13909

Asynchronous Webrequest best practices

What is the best practice for getting a webrequest asynchronously?

I want to download a page from the internet (doesn't matter what) and avoid blocking a thread as much as possible.

Previously I believed that it was enough to just use the 'BeginGetResponse' and 'EndGetResponse' pair. But on closer inspection I also see that there is the option of using 'BeginGetRequestStream'

[UPDATE] GetRequestStream is used for POST operations

And then to add to the confusion, Should I be using stream.BeginRead and EndRead?

[UPDATE] this article suggests it is even better to process the HttpResponse.GetResponseStream asynchronously using Stream.BeginRead

What a mess!

Can someone point me in the right direction?

What is the Best Practice?

Upvotes: 8

Views: 8270

Answers (3)

chuckj
chuckj

Reputation: 29615

You could code this all yourself or you could just use WebClient which does a lot of the grunt work for you. For example, to download file as a string you would call DownloadStringAsync() which eventually will trigger the OnDowloadStringCompleted event. If the file is binary you might try using DownloadDataAsync() instead.

Upvotes: 5

JeremyWeir
JeremyWeir

Reputation: 24388

Have you considered doing the web request in a new thread?

http://msdn.microsoft.com/en-us/library/ms173178.aspx

Upvotes: 0

mbeckish
mbeckish

Reputation: 10579

  1. You use Begin/EndGetResponse to asynchonously wait for the HTTP response. If you are doing a POST and need to send a lot of data asynchronously, use Begin/EndGetRequestStream.

  2. This isn't unique to asynchronous communication - you can look up the synchronous versions to get additional info.

  3. I'm not sure why you would be doing a Read on the request stream - most likely you'll be writing to it, and reading from the Response stream.

Finally, Jeffrey Richter's blog has an article about some of the subtleties of HttpWebRequest and streams.

Upvotes: 0

Related Questions