Пример ответа
Коротко: Асинхронность в C# — это подход к написанию неблокирующего кода, который позволяет выполнять длительные операции (например, I/O или сетевые запросы) без блокировки основного потока, повышая отзывчивость и масштабируемость приложений.
Ключевые идеи:
- Использует ключевые слова async/await для упрощения асинхронного программирования, скрывая сложность потоков.
- Позволяет освобождать текущий поток во время ожидания операций, что особенно полезно в веб-сервисах и API.
- Основан на Task и Task<T> для представления асинхронных операций, обеспечивая эффективное управление ресурсами.
Пример: В веб-приложении на ASP.NET Core асинхронный метод контроллера может выполнять запрос к базе данных через Entity Framework, используя await, чтобы не блокировать поток запроса и обслуживать больше пользователей одновременно.
Пример асинхронного метода в C# для загрузки данных из API с использованием HttpClient.
csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class ApiService
{
private readonly HttpClient _httpClient;
public ApiService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<string> GetDataAsync(string url)
{
try
{
HttpResponseMessage response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
return content;
}
catch (HttpRequestException ex)
{
Console.WriteLine($"Ошибка при запросе: {ex.Message}");
return null;
}
}
}
// Использование в ASP.NET Core контроллере:
// [HttpGet("data")]
// public async Task<IActionResult> GetData()
// {
// var data = await _apiService.GetDataAsync("https://api.example.com/data");
// return Ok(data);
// }
Вопросы для интервьюера:
- В чём разница между async/await и многопоточностью? — Async/await использует асинхронные операции ввода-вывода, освобождая потоки во время ожидания, тогда как многопоточность создаёт отдельные потоки для параллельного выполнения кода, что может быть менее эффективно для I/O-задач.
- Как избежать deadlock при использовании async/await? — Использую ConfigureAwait(false) в библиотечном коде, чтобы избежать захвата контекста синхронизации, и избегаю блокирующих вызовов, таких как .Result или .Wait(), в асинхронных методах.
Практический совет (на неделю):
- Начните с преобразования длительных I/O-операций в асинхронные методы, используя async/await, чтобы улучшить производительность вашего веб-приложения.
- Используйте инструменты вроде профилировщика или логирования для мониторинга асинхронных операций и выявления узких мест, таких как чрезмерное создание задач.
C# Backend
Общий
37%
Следующий: Что такое dependency injection
Предыдущий: Что такое многопоточность