← Назад к вопросам
Для чего нужен 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 для лучшей интеграции.