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);
}
提示:啓動一個新的線程,以便UI不會掛起。然後根據您的情況殺死線程。 –
退房提出的解決方案[這裏](http://stackoverflow.com/questions/17494502/implementing-extension-method-webrequest-getresponseasync-with-support-for-cance) – kindasimple
可能的解決方法http://stackoverflow.com/questions/24980427/task-factory-fromasync-with-cancellationtokensource – dotnetstep