【问题标题】:How can I kill this task in C#?如何在 C# 中终止此任务?
【发布时间】:2015-01-17 02:08:27
【问题描述】:

我正在检查一个 URL 并开始一项新任务以防止 UI 冻结。

像这样:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;              
request.Method = "HEAD";
var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse,request.EndGetResponse,null);

重点是.. 我实施了最大时间(例如 10 秒)。 如果应用达到 10 秒无响应,则必须中止任务。

【问题讨论】:

  • 提示:启动一个新线程,这样 UI 就不会挂起。然后根据你的情况杀死线程。
  • 查看建议的解决方案here
  • 这段代码的目的是什么?你想做什么?

标签: c#


【解决方案1】:

HttpWebRequest 不允许您轻松地对异步请求应用超时。

我建议你使用更现代的HttpClient

using (var client = new HttpClient())
{
    client.Timeout = TimeSpan.FromSeconds(10);
    var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, url));
}

如果您被困在HttpWebRequest 土地上,那么您可以使用调用Abort 的计时器(未经测试):

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

【讨论】:

  • 第二种解决方案在这一行返回错误: var requestTask = Task.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null);调用不明确
  • @MarceloBarganha:已修复。
猜你喜欢
  • 1970-01-01
  • 2015-01-28
  • 2020-09-03
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多