Sobes.tech
Назад к вопросам
Junior — Middle
63

Какие варианты возвращаемых значений может иметь асинхронный метод, помеченный ключевым словом async?

Компании, где спрашивали
AndersenAndersen

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Асинхронный метод async в C# обычно возвращает Task, Task<T> или void. В современных версиях также возможны ValueTask и ValueTask<T>, но это уже более частный случай. Чаще всего на практике ожидают увидеть именно Task и Task<T>.

Определение:

async помечает метод как асинхронный, то есть позволяющий использовать await внутри тела. Тип возвращаемого значения определяет, можно ли дождаться завершения метода и получить результат.

Если метод не возвращает значение, обычно используется Task. Если метод возвращает результат, используется Task<T>. void для async-методов применяется редко и в основном только для обработчиков событий, потому что такой метод нельзя нормально ждать и перехватывать его исключения сложнее.

Пример использования:

public async Task LoadDataAsync()
{
    await Task.Delay(1000);
}

public async Task<int> GetCountAsync()
{
    await Task.Delay(1000);
    return 42;
}

public async void Button_Click(object sender, EventArgs e)
{
    await Task.Delay(1000);
}

Пояснение кода:

  • LoadDataAsync возвращает Task, потому что результат не нужен, важен сам факт завершения операции.
  • GetCountAsync возвращает Task<int>, потому что после завершения нужно получить int.
  • Button_Click возвращает void, потому что это обработчик события; в обычном прикладном коде async void лучше избегать.
  • await Task.Delay(1000) имитирует асинхронную операцию без блокировки потока.

Ключевые моменты:

  • Основные варианты: Task, Task<T>, void.
  • Task — если метод ничего не возвращает, но его нужно await-ить.
  • Task<T> — если метод возвращает результат после завершения.
  • async void допустим в основном для обработчиков событий.
  • В современных версиях C# также применяются ValueTask и ValueTask<T> для оптимизации в отдельных сценариях.
  • Исключения из async Task и async Task<T> можно нормально наблюдать через await, а у async void это существенно неудобнее.