Использование WhenAny с динамическим списком Dynami c - PullRequest
0 голосов
/ 19 марта 2020

Кто-нибудь знает, будет ли Task.WhenAny(IEnumerable<Task>) работать должным образом, если элементы будут добавлены в list после ожидания? ie:

class lunch {

    private List<Task> lunchTasks = new List<Task>();

    public void MakeLunch() {
        Task makeSandwich = new Task();
        Task eatSandwich = new Task();
        makeSandwich.Delay(-1);
        eatSandwich.Delay(-1);
        lunchTasks.Add(makeSandwich);
        lunchTasks.Add(eatSandwich);
        await Task.WhenAny(lunchTasks).ConfigureAwait(false);
    }

    public void CleanUp() {
        Task cleanUp = Task.CompletedTask;
        lunchTasks.Add(cleanUp);
    }
}

Если предположить, что CleanUp() вызывается после MakeLunch() асинхронно, MakeLunch() когда-либо вернется / завершится?

1 Ответ

1 голос
/ 19 марта 2020

Нет. Оба метода WhenAny и WhenAll немедленно делают защитную копию поставляемого перечислимого, как вы можете видеть в исходном коде :

public static Task<Task> WhenAny(IEnumerable<Task> tasks)
{
    if (tasks == null) throw new ArgumentNullException("tasks");
    Contract.EndContractBlock();

    // Make a defensive copy, as the user may manipulate the tasks collection
    // after we return but before the WhenAny asynchronously completes.
    List<Task> taskList = new List<Task>();
    foreach (Task task in tasks)
    {
        if (task == null) throw new ArgumentException(Environment
            .GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks");
        taskList.Add(task);
    }

    if (taskList.Count == 0)
    {
        throw new ArgumentException(Environment
            .GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks");
    }

    // Previously implemented CommonCWAnyLogic() can handle the rest
    return TaskFactory.CommonCWAnyLogic(taskList);
}

Поэтому любые последующие модификации перечислимого будут игнорироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...