Marcelo Barganha
Marcelo Barganha

Reputation: 379

How can I kill this task in C#?

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

Answers (1)

Stephen Cleary
Stephen Cleary

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

Related Questions