Обзор вопросов по языка програмиированию C# и технологии NET
async
/ await
)Понятие | Описание |
---|---|
Thread (Поток) | Независимый поток выполнения на CPU. |
Task (Задача) | Абстракция работы, которая может выполняться асинхронно или на потоке. |
Async/await | Синтаксис для асинхронного программирования, использующий Task . |
ThreadPool | Пул потоков, управляемый CLR, для повторного использования потоков. |
SynchronizationContext | Контекст, в котором продолжается выполнение кода после await (UI, ASP.NET). |
System.Threading.Thread
Thread t = new Thread(() => Console.WriteLine("Hello"));
t.Start();
Особенности:
ThreadPool.QueueUserWorkItem
/ Task.Run()
Плюсы:
Минусы:
Task
— представляет асинхронную или параллельную работуTask t = Task.Run(() => DoWork());
await t; // ожидание завершения
Особенности:
Task
— легковесная абстракцияTask<T>
)async
/ await
)async Task<int> GetDataAsync()
{
var result = await HttpClient.GetStringAsync("https://example.com");
return result.Length;
}
Механизм:
async
компилируется в state machine.await
метод приостанавливается, управление возвращается вызывающему.Понятие | Механизм | Применение |
---|---|---|
Многопоточность | Несколько потоков CPU | CPU-bound задачи (вычисления) |
Асинхронность | Не блокирующее ожидание IO | IO-bound задачи (запросы к сети/файлам) |
Для многопоточности, чтобы избежать гонок:
lock
— простой мониторMutex
— межпроцессныйSemaphore
/ SemaphoreSlim
— ограничение числа потоковMonitor.Enter/Exit
— вручнуюReaderWriterLockSlim
— чтение/записьInterlocked
— атомарные операцииAsync-friendly:
SemaphoreSlim.WaitAsync()
await vs Thread
SynchronizationContext
Deadlocks
.Result
или .Wait()
на UI или ASP.NET вызывается deadlock.Thread safety
Task vs Thread
ConfigureAwait(false)
Async all the way
CancellationToken
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(); // не блокирует поток
Характеристика | Асинхронность | Многопоточность |
---|---|---|
Цель | Не блокировать поток при IO | Использовать CPU параллельно |
Поток | Один поток, может освобождаться | Несколько потоков одновременно |
Использование | async/await , Task |
Thread , ThreadPool , Task |
Примитивы синхронизации | SemaphoreSlim, async locks | lock, Mutex, Monitor, Interlocked |
Deadlock | Возможен при sync-over-async | Возможен при неправильном lock |
Производительность | Эффективнее для IO | Эффективнее для CPU-heavy |
✨Dvurechensky✨