Попытка понять разницу между TPL и async
/await
, когда дело доходит до создания потока.
Я считаю, что TPL(TaskFactory.StartNew
)работает аналогично ThreadPool.QueueUserWorkItem
в том смысле, что ставит в очередь работу над потоком в пуле потоков. Это, конечно, если вы не используете TaskCreationOptions.LongRunning
, который создает новый поток.
Я думал, что async
/ await
будут работать одинаково, поэтому по существу:
TPL:
Factory.StartNew( () => DoSomeAsyncWork() )
.ContinueWith(
(antecedent) => {
DoSomeWorkAfter();
},TaskScheduler.FromCurrentSynchronizationContext());
Async
/Await
:
await DoSomeAsyncWork();
DoSomeWorkAfter();
будут идентичными. Из того, что я читал, кажется, что async
/await
только «иногда» создает новый поток. Итак, когда он создает новый поток, а когда не создает новый поток? Если бы вы имели дело с портами завершения ввода-вывода, я вижу, что не нужно создавать новый поток, но в противном случае я бы подумал, что это необходимо. Думаю, мое понимание FromCurrentSynchronizationContext
тоже всегда было немного нечетким. Я всегда думал, что это, по сути, поток пользовательского интерфейса.