Коллекция вопросов ❓ на собеседовании в C# 🍧

Обзор вопросов по языка програмиированию C# и технологии NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

⚡ Как устроены асинхронность и многопоточность в .NET?

Typing SVG

Static Badge

✨ Оглавление

⬆ Вернуться к главной


1️⃣ Основные понятия

Понятие Описание
Thread (Поток) Независимый поток выполнения на CPU.
Task (Задача) Абстракция работы, которая может выполняться асинхронно или на потоке.
Async/await Синтаксис для асинхронного программирования, использующий Task.
ThreadPool Пул потоков, управляемый CLR, для повторного использования потоков.
SynchronizationContext Контекст, в котором продолжается выполнение кода после await (UI, ASP.NET).

2️⃣ Потоки (Thread)

Thread t = new Thread(() => Console.WriteLine("Hello"));
t.Start();

3️⃣ ThreadPool


4️⃣ Tasks (Task Parallel Library, TPL)

Task t = Task.Run(() => DoWork());
await t; // ожидание завершения

5️⃣ Асинхронность (async / await)

async Task<int> GetDataAsync()
{
    var result = await HttpClient.GetStringAsync("https://example.com");
    return result.Length;
}

6️⃣ Многопоточность vs Асинхронность

Понятие Механизм Применение
Многопоточность Несколько потоков CPU CPU-bound задачи (вычисления)
Асинхронность Не блокирующее ожидание IO IO-bound задачи (запросы к сети/файлам)

7️⃣ Примитивы синхронизации


8️⃣ Каверзные моменты и вопросы

  1. await vs Thread

    • await не создаёт поток, поток освобождается.
    • Task.Run создаёт работу в пуле потоков.
  2. SynchronizationContext

    • UI-thread или ASP.NET context влияет на продолжение после await.
  3. Deadlocks

    • Часто при .Result или .Wait() на UI или ASP.NET вызывается deadlock.
  4. Thread safety

    • Любые shared data → lock или concurrent collections.
  5. Task vs Thread

    • Task — легковесный, может использовать поток из пула.
    • Thread — тяжелый, отдельный стек.
  6. ConfigureAwait(false)

    • Продолжение после await не обязательно на исходном контексте → предотвращает deadlock, повышает производительность.
  7. Async all the way

    • Если метод async вызывает синхронный блокирующий код, эффективность падает.
  8. CancellationToken

    • Позволяет отменять задачи асинхронно.

9️⃣ Пример: CPU-bound vs IO-bound

CPU-bound:

var tasks = new Task[4];
for(int i=0;i<4;i++)
    tasks[i] = Task.Run(() => ComputeHeavy());
Task.WaitAll(tasks);

IO-bound:

async Task FetchDataAsync()
{
    var data = await httpClient.GetStringAsync("https://example.com");
    Console.WriteLine(data);
}
await FetchDataAsync(); // не блокирует поток

🔟 Таблица: асинхронность vs многопоточность

Характеристика Асинхронность Многопоточность
Цель Не блокировать поток при IO Использовать CPU параллельно
Поток Один поток, может освобождаться Несколько потоков одновременно
Использование async/await, Task Thread, ThreadPool, Task
Примитивы синхронизации SemaphoreSlim, async locks lock, Mutex, Monitor, Interlocked
Deadlock Возможен при sync-over-async Возможен при неправильном lock
Производительность Эффективнее для IO Эффективнее для CPU-heavy

⬆ Вернуться к главной

✨Dvurechensky✨