我有一个在可移植类库中制作的 API,它需要访问特定于平台的 API 以发送 HTTP 请求。这是我编写的在 WinRT 上执行 HTTP POST 的方法:
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 个线程,它就可以正常工作。似乎抛出的线程越多,性能越差
究竟我在这里做错了什么?