HTTP 要求を送信するためにプラットフォーム固有の API にアクセスする必要があるポータブル クラス ライブラリで作成された API があります。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 つのスレッドで実行したりすると、問題なく動作します。スローされるスレッドが増えるほど、パフォーマンスが指数関数的に悪化するようです
ここで何が間違っているのですか?