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); }