Предположим, что у нас есть массив задач (называемых "задачами" ), а затем преобразовываем его в список (называемый "temp" ), говоря:
var temp = tasks.ToList();
Что происходит с теми запущенными задачами, на которые указывают элементы массива? У нас есть два набора задач, выполняемых отдельно (один в "задачах", а другой - в "temp" )? Или они указывают на одни и те же задачи?
Следующий код (взятый из книги Exam 70-483) относится к тому, что я говорю (последние три строки):
Task<int>[] tasks = new Task<int>[3];
tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; });
tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; });
tasks[2] = Task.Run(() => { Thread.Sleep(3000); return 3; });
while (tasks.Length > 0) {
int i = Task.WaitAny(tasks);
Task<int> completedTask = tasks[i];
Console.WriteLine(completedTask.Result);
var temp = tasks.ToList();
temp.RemoveAt(i);
tasks = temp.ToArray();
}
ОБНОВЛЕНИЕ: Я знаю цель последних трех строк, но не знаю, почему это работает.