如果我将延续链接在一起,它们似乎是以我没想到的顺序执行的。
例如:
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 反序列化,长度:878
5 完成
我在这里想念什么?
编辑:
是的,我知道闭包,真正的代码要长得多,当然会处理这个,但是我去掉了我认为与问题无关的废话,然后每个人都去关注丢失的废话!它不会改变我看到的问题或问题。