Ваша проблема в том, что цикл for
работает намного быстрее, чем создание задач, и поэтому к моменту запуска задач переменная i
уже достигла конца цикла.
Чтобы исправить это, вам нужно взять копию i
внутри цикла и использовать ее.
Попробуйте этот код:
private async Task CreateToDoAsync()
{
List<Task> taskList = new List<Task>();
for (int i = 1; i < 10; i++)
{
var local_i = i;
var task = Task.Run(() => CreateToDo(local_i));
Task continuation = task.ContinueWith((antecedent) => Invoke(new AssignTaskDelegate(AssignTask), (new Person()
{
Name = $"Person_{local_i}",
ToDoForPerson = antecedent.Result
})));
taskList.Add(task);
}
await Task.WhenAll(taskList.ToArray());
}
Теперь предпочтительнее использовать Microsoft Reactive Framework (NuGet «System.Reactive») для этой работы. Ваш код будет выглядеть так:
private async Task CreateToDoAsync()
{
var query =
from i in Observable.Range(1, 9)
from t in Observable.Start(() => CreateToDo(i))
select new Person() { Name = $"Person_{i}", ToDoForPerson = t };
await query.ObserveOn(listBoxToDo).Do(x => AssignTask(x));
}
Готово. Вот и все.
Когда я запускаю свой код (с выводом AssignTask
на консоль), я получаю это:
Person_1, Todo 1
Person_2, Todo 2
Person_3, Todo 3
Person_6, Todo 6
Person_7, Todo 7
Person_4, Todo 4
Person_5, Todo 5
Person_8, Todo 8
Person_9, Todo 9
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .ObserveOn(listBoxToDo)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. "*1020*."