Задать вопрос
Viji
@Viji
DevOps Engineer

Должны ли все асинхронные методы вызываться с ключом async?

Пытаюсь лучше понять как работает async/awai и Task в дотнете

Есть два следующих простых метода

public async Task<int> CalculateAsync(int x, int y)
{
    return await Task.Run(() => Calculate(x, y));
}

private int Calculate(int x, int y)
{
    // Simuliruyem dolgiy process
    Thread.Sleep(5000);
    return x + y;
}


Несколько вопросов по этому коду:
1) Нормально ли что у вызываемого Calculate отсутствует слово async, не приведет ли это к синхронному выполнению?
2) Стоит ли всегда использовать ключ Task при обьявлении асинхронного метода?
  • Вопрос задан
  • 87 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
Calculate не является асинхронной функцией поэтому async не нужен. И очень плохо вызывать в асинхронном коде Thread.Sleep, для асинхронного кода есть Task.Delay.

async преобразует код в конечный автомат (State Machine)
Ответ написан
@rPman
Асинхронность - это механизм многозадачности в пределах одного потока (.net умеет это делать и в пределах нескольких потоков), когда существует некий цикл, в пределах которого код (пользовательские функции) выполняются по очереди.

Чтобы асинхронность эффективно работала (как альтернатива threading), нужно чтобы эти кусочки кода исполнялись максимально короткое время. Если у тебя есть код, исполняющийся длительное время, то либо дели его на части (например есть цикл, то меняешь логику кода так чтобы кусками кода было содержимое цикла) либо используй threading.

async/await это синитаксический сахар, позволяющий красиво использовать асинхронный код в обычном стиле программирования. Когда компилятор видит async он сохраняет состояние (стек) и передает выполнение к очереди для других кусков кода (помеченный async)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы