我有一個在可移植類庫中製作的API,它需要聯繫特定於平臺的API來發送HTTP請求。這是我寫的做的WinRT的HTTP POST方法:爲什麼HttpClient在這裏出現死鎖?
任何這種壓力下把時雖然public bool Post(IEnumerable<KeyValuePair<string, string>> headers, string data)
{
bool success = false;
HttpClient client = new HttpClient(new HttpClientHandler {AllowAutoRedirect = false});
foreach (var header in headers)
{
client.DefaultRequestHeaders.Add(header.Key, header.Value);
}
try
{
var task=client.PostAsync(endpoint, new StringContent(data, Encoding.UTF8, "text/xml")).ContinueWith(postTask =>
{
try
{
postTask.Wait(client.Timeout); //Don't wait longer than the client timeout.
success = postTask.Result.IsSuccessStatusCode;
}catch {}
}, TaskContinuationOptions.LongRunning);
task.ConfigureAwait(false);
task.Wait(client.Timeout);
}
catch
{
success = false;
}
return success;
}
這雖然顯示出一個有趣的問題。它似乎在內部陷入僵局。就像我創建5個線程併發送POST請求一樣,這個方法將會到達它將要執行的地方沒有任何但超時。內容永遠不會到達服務器,並且.Continue
代碼永遠不會執行。但是,如果我連續運行它,或者甚至可能使用2或3個線程,它將工作正常。看來,在它拋出了更多的線程,雖然使性能成倍糟糕
究竟是什麼我做錯了嗎?
你知道關於你要呼叫的端點上的性能監視器的任何信息嗎?什麼是網絡服務器的平均響應時間以及您的本地超時時間有多短?可能是在負載下,性能會受到影響,超時會在請求返回之前觸發。 – cgotberg
@cgotberg我用幾臺不同的服務器測試過它。我的主要「愚蠢」測試服務器只是webrick。我還使用了其他使用IIS等的服務器。最大的問題是,即使在觀看Fiddlr時,我也可以看到沒有任何交流發生。在實際發送任何東西之前,它被鎖定在某個地方 – Earlz