Reputation: 379
I'm checking a URL and start a new task to prevent UI freezing.
Like this:
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "HEAD";
var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse,request.EndGetResponse,null);
The point is.. I'm implemented a max time (for example 10 seconds). If the app reach 10 seconds without response, the task must be aborted.
Upvotes: 0
Views: 294
Reputation: 456407
HttpWebRequest
does not allow you to easily apply a timeout to asynchronous requests.
I recommend you use the more modern HttpClient
:
using (var client = new HttpClient())
{
client.Timeout = TimeSpan.FromSeconds(10);
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, url));
}
If you are stuck in HttpWebRequest
land, then you can use a timer that calls Abort
(untested):
static async Task<HttpWebResponse> GetResponseWithTimeoutAsync(this HttpWebRequest request, TimeSpan timeout)
{
// Start request and timeout
var delayTask = Task.Delay(timeout);
var requestTask = Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null);
var completedTask = await Task.WhenAny(delayTask, requestTask);
if (completedTask == delayTask)
{
request.Abort();
throw new TimeoutException();
}
return (HttpWebResponse)(await requestTask);
}
Upvotes: 1