← Назад к вопросам

Для чего нужен Async/Await?

1.2 Junior🔥 161 комментариев
#C# и ООП#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Async/Await в C#

Async/Await это синтаксическая конструкция для написания асинхронного кода в C# и Unity. Это один из самых важных инструментов для разработки отзывчивых игр.

Почему нужен Async/Await?

Проблема без async/await:

private void LoadGameData() {
    var data = database.GetUserData(); // Блокирует на 2 секунды
    Debug.Log("Готово");
}

private void Update() {
    // Не выполняется во время загрузки
    if (Input.GetKeyDown(KeyCode.Space)) {
        Jump();
    }
}

Решение:

private async Task LoadGameDataAsync() {
    var data = await database.GetUserDataAsync();
    Debug.Log("Готово");
}

private void Update() {
    // Работает параллельно с загрузкой
    if (Input.GetKeyDown(KeyCode.Space)) {
        Jump();
    }
}

Как работает?

Async превращает метод в state machine, который может приостанавливаться и продолжаться.

Примеры в Unity

1. Загрузка сцены

public async Task LoadLevel(string levelName) {
    var operation = SceneManager.LoadSceneAsync(levelName);
    await operation;
    Debug.Log("Готово");
}

2. HTTP запросы

public async Task<string> FetchData(string url) {
    using (var client = new HttpClient()) {
        var response = await client.GetAsync(url);
        return await response.Content.ReadAsStringAsync();
    }
}

3. Цепочки операций

public async Task InitGame() {
    await LoadAssets();
    await ConnectServer();
    await LoadProfile();
    StartGame();
}

4. Параллельные операции

public async Task LoadAll() {
    var assets = LoadAssetsAsync();
    var config = LoadConfigAsync();
    var profile = LoadProfileAsync();
    await Task.WhenAll(assets, config, profile);
}

Возвращаемые типы

// Task без результата
public async Task SaveGame() {
    await database.SaveAsync();
}

// Task<T> с результатом
public async Task<int> GetScore() {
    return await database.GetScoreAsync();
}

// Избегай async void
private async void BadExample() {
    await DoSomethingAsync();
}

Обработка ошибок

public async Task<string> FetchSafe() {
    try {
        return await FetchAsync();
    } catch (HttpRequestException ex) {
        Debug.LogError(ex);
        return null;
    }
}

Timeout

public async Task<string> FetchWithTimeout() {
    using (var cts = new CancellationTokenSource(5000)) {
        return await FetchAsync(cts.Token);
    }
}

Плохие практики

// Плохо: блокирует поток
var result = GetDataAsync().Result;

// Плохо: забыл await
var task = GetDataAsync();

// Хорошо
var data = await GetDataAsync();

Выводы

Async/Await позволяет писать асинхронный код не блокируя основной поток. Улучшает отзывчивость игры. Всегда используй Task, избегай async void. В Unity рекомендуется использовать UniTask для лучшей интеграции.