Ответ 1
Это деталь реализации CAS, Security Access Security. Который может проверить, имеет ли поток достаточные права для выполнения операции. Это имеет значение только в том случае, если код работает в ограниченной среде безопасности, не работает с полным доверием или в изолированной программной среде.
Сантехника, которая делает эту работу, сложна, и я могу только приблизиться к ее работе. Класс ExecutionContext является ключевым, он определяет контекст безопасности, в котором выполняется код. Все становится трудным, когда поток, который работает с ограниченными правами, запускает другой поток. Ясно, что другой поток должен запускаться с теми же ограничениями, что и исходный поток. CAS зависит от возможности выполнять стеки, чтобы обнаружить ограничения. Это сложно в другом потоке, у него есть свой собственный стек.
Метод ExecutionContext.Capture() выполняет здесь важную роль. Он создает копию контекста вызывающего потока, включая создание стека, чтобы создать "сжатый" стек обнаруженных атрибутов безопасности. Затем новый поток запускается с этим захваченным контекстом.
ThreadPool.UnsafeQueueUserWorkItem() пропускает вызов Capture(). Нить threadpool будет работать с контекстом выполнения по умолчанию.
Это оптимизация, Capture() не является дешевым методом. Это имеет значение в виде программы, которая зависит от потоков ТП, чтобы ускорить работу. Веб-сервер подскакивает. Также тип кода, который использует этот метод, вы видите, что он используется во внутренних методах в пространстве имен System.Net, например.
Очевидно, что это небезопасно, оно не работает с ограничениями CAS исходного потока.