2015-01-17 17 views
0

我正在檢查一個URL並開始一個新任務以防止UI凍結。如何在C#中完成這項任務?

像這樣:

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秒沒有響應,則該任務必須中止。

+0

提示:啓動一個新的線程,以便UI不會掛起。然後根據您的情況殺死線程。 –

+0

退房提出的解決方案[這裏](http://stackoverflow.com/questions/17494502/implementing-extension-method-webrequest-getresponseasync-with-support-for-cance) – kindasimple

+0

可能的解決方法http://stackoverflow.com/questions/24980427/task-factory-fromasync-with-cancellationtokensource – dotnetstep

回答

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

第二種解決方案在此行中返回錯誤: var requestTask = Task.Factory.FromAsync(request.BeginGetResponse,request.EndGetResponse,null); 電話不明確 –

+0

@MarceloBarganha:固定。 –