Сообщение 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.
Поэтому лучше явно указать
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(add()) это указать TaskCreationOptions.LongRunning)
и если метод начинается с долгого синхронного метода
Но у Run таких методов нет. Нужно использовать Task.Factory.StartNew
Согласен намутили. Нужно более прозрачно
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
Согласен намутили. Нужно более прозрачно