Подскажите, как именно устроена работа TaskCompletionSource в C#.
Интересуют следующие вопросы:
1. При использовании TaskCompletionSource создаётся новый поток (Task)?
2. Если не создаётся, то в каком потоке он ожидает установки SetResult?
3. Есть ли отличие от ManualResetEvent (помимо возврата Task), который блокирует поток, пока не дождётся?
4. Будет ли выгода от замены ManualResetEvent на TaskCompletionSource, если event ждёт сообщения из вне по сокету?
Описание работы: andrey.moveax.ru/post/csharp-sync-to-async
И из него:
1. Новый поток создается вами при необходимости. TaskCompletionSource создает только инстанс типа Task
2. Ожидает в том который запросил результат.
3. ManualResetEvent работает с обьектом ядра "event", и этот обьект не блокирует поток.
4. "event" вы всегда можете проверить на состояние и если оно не сигнальное, но продолжить нужные дела.
2. А если он записан как await в async методе, там ведь выполнение продолжается. И нет блокировки. Как он понимает, что можно продолжать выполнение? По методу SetResult отрабатывает callback и по нему выполняется продолжение? Т.е. сам Task он не запускает с методом на подобии Task.Run(() => waitsetresult)); ?
Михаил: TaskCompletionSource это обьект для отслеживания состояния, он ничего не запускает. await применяется к истансу Task, а не к TaskCompletionSource.