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

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

Изменено 31.12.2020 9:19 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 компилятор это дело маскирует.

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

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


Но единственный момент где стоит применять
tasks.Add(Task.Run(async ()=> await add());
вместо
tasks.Add(add()) это указать TaskCreationOptions.LongRunning)

и если метод начинается с долгого синхронного метода



async Task CallLongMethod()
{
  
 LongMethod()
  await Task.Yield();
}


Но у Run таких методов нет. Нужно использовать Task.Factory.StartNew
Согласен намутили. Нужно более прозрачно