Информация об изменениях

Сообщение Re[3]: SemaphoreSlim(1, 1) WaitAsync 2 -- пару вопросов. от 30.12.2020 20:35

Изменено 30.12.2020 20:48 Serginio1

Re[3]: SemaphoreSlim(1, 1) WaitAsync 2 -- пару вопросов.
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>>А зачем использовать Task.Run?


S>Factory верент Task<Task>


S>>ведь проще добавить

S>> tasks.Add(add());
S>> tasks.Add(remove());
S>>ну можно еще и ConfigureAwait длбавить
S>>только вот
S>>async void Add() не возвращает Task

S>Вот только в том дело, что при Task.Run компилятор это дело маскирует.

Task.Run запускает задачу. Но внутри задачи происходит вызов async void Add() это все равно, что запустить

async Task Add() без await. Автомат не будет построен и задача Task.Run завершиться, а async void продолжит работу.
Тут нет никакой маскировки.
Re[3]: SemaphoreSlim(1, 1) WaitAsync 2 -- пару вопросов.
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Serginio1, Вы писали:


S>>А зачем использовать Task.Run?


S>Factory верент Task<Task>


S>>ведь проще добавить

S>> tasks.Add(add());
S>> tasks.Add(remove());
S>>ну можно еще и ConfigureAwait длбавить
S>>только вот
S>>async void Add() не возвращает Task

S>Вот только в том дело, что при Task.Run компилятор это дело маскирует.

Не то, что маскирует. Он не может понять какой метод вызвать
ПЕРЕГРУЗКИ
Run(Action)
Ставит в очередь заданную работу для запуска в пуле потоков и возвращает объект Task, представляющий эту работу.
Run(Func<Task>)
Ставит в очередь указанную работу для запуска в пуле потоков и возвращает прокси для задачи, возвращаемой функцией function.

Поэтому лучше явно указать
 tasks.Add(Task.Run(async ()=> await add());
tasks.Add(Task.Run(async ()=> await remove());