継続を連鎖させると、予期していなかった順序で実行されているように見えます。
例えば:
for (int i = 1; i < 6; i++)
{
HttpRequestMessage request = new HttpRequestMessage();
Task<JsonResult<MyResult>> message = Task.Factory.StartNew<HttpResponseMessage>(() =>
{
Console.WriteLine(i + " started");
return client.SendAsync(request).Result;
})
.ContinueWith<JsonResult<MyResult>>((r) =>
{
var stringresult = r.Result.Content.ReadAsStringAsync().Result;
var deserialized = JsonConvert.DeserializeObject<JsonResult<MyResult>>(stringresult);
Console.WriteLine(deserialized.Id + " deserialized");
return deserialized;
})
.ContinueWith<JsonResult<MyResult>>(m =>
{
Console.WriteLine(m.Id + " completed");
return m.Result;
});
}
これで、さまざまなリクエストがインターリーブされることを期待していますが、個々のプロセスが開始、逆シリアル化、完了の順に実行されることを期待しています。ただし、次のように、「完了した」継続が逆シリアル化継続の前に実行される場合があります。
1開始
2開始
3開始
4開始
1逆シリアル化、長さ:69
1完了
5開始
5逆シリアル化、長さ:831
2完了
4逆シリアル化、長さ:1022
3完了
3逆シリアル化、長さ:356
4完了
2逆シリアル化、長さ:8785
完了
ここで何が欠けていますか?
編集:
はい、クロージャーについて知っています。実際のコードははるかに長く、もちろんこれを処理しますが、質問に関連するとは思わなかったガフを取り除き、それからみんなが行方不明のガフに集中します!! それは私が見ている質問や問題を変えるものではありません。