Это проблема времени сна.Просто увеличьте разрыв между двумя сновидениями, и вы получите ответ.
Существует два потока: основной поток и поток, выполняющий критическую работу.Теперь, когда вызывается прерывание, поток 't' будет прерываться мгновенно, даже если он не завершил критическую область.
Теперь, когда вы отправили основной поток в спящий режим на 2 мс, а поток t на 1 мс, иногда t завершит критический раздел, а иногда - нет.Вот почему значение IsComplete иногда равно false, а иногда true.
Теперь просто отправьте основной поток в спящий режим на 100 мс, и вы обнаружите, что IsComplete всегда имеет значение true.И наоборот, отправьте поток "t" в спящий режим на 100 мс, и вы обнаружите, что IsComplete всегда ложно.
РЕДАКТИРОВАТЬ
ОТ MSDN
Уведомленияхост, выполнение которого собирается ввести область кода, в которой последствия прерывания потока или необработанного исключения могут поставить под угрозу другие задачи в домене приложения.
Например, рассмотрим задачукоторый пытается выделить память, удерживая блокировку.Если распределение памяти завершается неудачно, прерывания текущей задачи недостаточно для обеспечения стабильности AppDomain, поскольку в домене могут быть другие задачи, ожидающие такой же блокировки.Если текущая задача завершена, другие задачи могут быть заблокированы.
При возникновении сбоя в критической области хост может принять решение выгрузить весь AppDomain, а не рисковать продолжать выполнение в потенциально нестабильном состоянии.,Чтобы сообщить хосту, что ваш код входит в критическую область, вызовите BeginCriticalRegion.Вызовите EndCriticalRegion, когда выполнение возвращается в некритическую область кода.
From CLR Inside Out: написание надежного кода
Состояние коррупции Есть три корзины, которыегосударственная коррупция может попасть в.Первый - это локальное состояние, которое включает локальные переменные и объекты кучи, которые используются только определенным потоком.Второе - это общее состояние, которое включает в себя все, что совместно используется потоками внутри домена приложения, например объекты, хранящиеся в статических переменных.Кэши часто попадают в эту категорию.Третий - это общие для всего процесса, для всей машины и общие для нескольких компьютеров состояния: в этот лагерь попадают менеджеры файлов, сокетов, разделяемой памяти и распределенных блокировок.
Количество состояний, которое может быть поврежденоАсинхронное исключение - это максимальное количество состояний, которое поток в настоящее время изменяет.Если поток выделяет несколько временных объектов и не предоставляет их другим потокам, только эти временные объекты могут быть повреждены. Но если поток пишет в общее состояние, этот общий ресурс может быть поврежден, и другие потоки могут потенциально столкнуться с этим поврежденным состоянием.Вы не должны допустить этого.В этом случае вы прерываете все другие потоки в Домене приложений, а затем выгружаете Домен приложений .Таким образом, асинхронное исключение переходит в домен приложений, вызывая его выгрузку и гарантируя, что любое потенциально поврежденное состояние будет отброшено.Для транзакционного хранилища, такого как база данных, эта переработка домена приложений обеспечивает устойчивость к повреждению локального и общего состояния.
Критические регионы позволяют обрабатывать ситуации, когда некоторый фрагмент кода может повредить другие домены приложений и нанести непоправимый ущербсистема.