我通過lambda表達式創建了一批匿名函數。我想使用TaskId來區分匿名函數。 下面是代碼:這是由C#編譯器完成的優化嗎?
int count = 3;
int i;
for (int j = 0; j < 10; j++)
{
i = 0;
Func<bool, Task<int>> func = async (b) =>
{
return j;
};
while (i++ < count)
{
var task = func(true);
Console.WriteLine(String.Format("Task Result:{0} TaskId:{1}",
task.Result, task.Id));
}
}
這裏是輸出
Task Result:0 TaskId:1
Task Result:0 TaskId:1
Task Result:0 TaskId:1
Task Result:1 TaskId:2
Task Result:1 TaskId:2
Task Result:1 TaskId:2
Task Result:2 TaskId:3
Task Result:2 TaskId:3
Task Result:2 TaskId:3
Task Result:3 TaskId:4
Task Result:3 TaskId:4
Task Result:3 TaskId:4
Task Result:4 TaskId:5
Task Result:4 TaskId:5
Task Result:4 TaskId:5
Task Result:5 TaskId:6
Task Result:5 TaskId:6
Task Result:5 TaskId:6
Task Result:6 TaskId:7
Task Result:6 TaskId:7
Task Result:6 TaskId:7
Task Result:7 TaskId:8
Task Result:7 TaskId:8
Task Result:7 TaskId:8
Task Result:8 TaskId:9
Task Result:8 TaskId:9
Task Result:8 TaskId:9
Task Result:9 TaskId:10
Task Result:9 TaskId:11
Task Result:9 TaskId:12
正如你所看到的,改變的taskid因爲結果是大於8我不知道到知道這樣做的原因現象。感謝您的幫助:)
有趣的是,從我可以告訴它重用任務實例(object.ReferenceEquals在比較'task'到上一個值時爲true)一段時間,但它不清楚爲什麼。 – 2014-10-20 04:30:23
@mikez是的。但我不知道爲什麼返回值會影響重用。 – 2014-10-20 05:09:32
任務正在緩存某處。在連續兩次的方法中運行該代碼。對於<= 8,相同的任務id會重複,但在此之上它們是新的。 – 2014-10-20 05:17:56