Пример ответа
Коротко: Task в C# — это тип, представляющий асинхронную операцию, которая может выполняться параллельно, не блокируя основной поток. В моём опыте я использовал Task для обработки запросов в веб-приложениях, например, при работе с API или базами данных, чтобы повысить производительность и отзывчивость.
Ключевые идеи:
- Task инкапсулирует состояние асинхронной операции, позволяя отслеживать её завершение, отмену или исключения.
- Он поддерживает await для неблокирующего ожидания, что упрощает написание асинхронного кода без колбэков.
- Task можно комбинировать через методы, такие как WhenAll или WhenAny, для параллельного выполнения нескольких операций.
Пример: Например, при загрузке данных из базы в веб-приложении я создаю Task<Data>, который выполняется асинхронно, пока основной поток обрабатывает другие запросы, используя await для получения результата без блокировки.
Пример асинхронного метода, возвращающего Task для загрузки пользователя из базы данных
csharp
using System;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
public class UserService
{
private readonly ApplicationDbContext _context;
public UserService(ApplicationDbContext context)
{
_context = context;
}
public async Task<User> GetUserByIdAsync(int userId)
{
// Асинхронно загружаем пользователя, не блокируя поток
var user = await _context.Users
.FirstOrDefaultAsync(u => u.Id == userId);
if (user == null)
{
throw new KeyNotFoundException("User not found");
}
return user;
}
}
// Использование в контроллере
public async Task<IActionResult> GetUser(int id)
{
try
{
var user = await _userService.GetUserByIdAsync(id);
return Ok(user);
}
catch (KeyNotFoundException ex)
{
return NotFound(ex.Message);
}
}
Вопросы для интервьюера:
- Чем Task отличается от Thread в C#? — Task — это абстракция над асинхронной операцией, которая может использовать пул потоков, в то время как Thread представляет отдельный поток ОС; Task более эффективен для I/O-операций и упрощает управление.
- Как вы обрабатываете исключения в Task? — Я использую try-catch с await для перехвата исключений в асинхронных методах или проверяю свойство Exception в Task, если работаю без await, чтобы избежать необработанных исключений.
Практический совет (на неделю):
- Используйте async/await для всех I/O-операций в бэкенде, чтобы избежать блокировки потоков и улучшить масштабируемость.
- При работе с несколькими Task применяйте Task.WhenAll для параллельного выполнения, но следите за ограничениями ресурсов, такими как подключения к базе данных.
C# Backend
Общий
33%
Следующий: Какие знаешь типы данных
Предыдущий: Что такое полиморфизм в ООП