Как в Task реализовали Wait()?

221
06 апреля 2017, 16:46

Я сомневаюсь, что Task.Wait() внутри имеет цикл while. Но как тогда его реализовали? Через хитрые локи?

Answer 1

Я сомневаюсь, что Task.Wait() внутри имеет цикл while.

Открываем исходники, читаем и доходим до метода SpinThenBlockingWait(). Как видно даже из названия метода, схема следующая: cначала небольшой спин (фактически тот самый "цикл while") в надежде, что таск завершится. Если не таск не завершился, уход на ожидание: на таск вешается продолжение, которое сигнализирует ManualResetEvent, и Wait() завершится, когда сработает ManualResetEvent.

По такой схеме - спин, а потом уход на ожидание - работают многие объекты синхронизации. Спин дешевый, а синхронизация дорогая. Поэтому можно покрутиться некоторое время в ожидании нужного события, а потом уйти в синхронизацию.

READ ALSO
Редактирование DataGridView

Редактирование DataGridView

Не могу отредактировать ячейки из DataGridView хотя ReadOnly = False; Заполняю грид так :

274
Что такое IDisposable простыми словами [дубликат]

Что такое IDisposable простыми словами [дубликат]

На данный вопрос уже ответили:

239
Получить тип класса по его имени

Получить тип класса по его имени

Как получить тип класса по его имени?

311
DataGridView аля «Система компоновки данных - 1С:Предприятие»

DataGridView аля «Система компоновки данных - 1С:Предприятие»

Задача: есть DataGridView, в который выводится разная нужная информацияCо временем информации, которую хотят видеть, много прирастает

189