Запуск метода содержащего Task.Run в другом методе через Task.Run
Как будет выполняться код? Будет 2 потока? Как я понимаю будет выполняться так:
- выделяется поток из пула в Method1
- выделяется поток из пула внутри Method2
public async void Method1()
{
await Task.Run(() => Method2());
}
private async void Method2()
{
await Task.Run(() =>
{
//код
});
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Task.Run запускает код в потоке из пула и возвращает Task, ожидающий окончания выполнения кода. Больше он ничего не делает. Все остальное зависит от контекста синхронизации, и если такового нет, то показанный код может использовать до 5 потоков.
Давайте посчитаем, я пронумерую строчки кода номерами потоков
public async void Method1()
{ // 1
await Task.Run(() => Method2() /* 2 */);
} // 3
private async Task Method2()
{ // 2
await Task.Run(() =>
{ // 4
});
} // 5
То есть возврат в метод после await может быть в любом другом потоке, не обязательно в том, из которого этот await начинался. Вот такая вот асинхронность.
И не используйте async void, я исправил ошибку, из-за которой этот код бы вообще не работал как надо.