Метод ICorProfilerInfo3::RequestProfilerDetach
Дает среде выполнения команду на отключение профилировщика.
Синтаксис
HRESULT RequestProfilerDetach(
[in] DWORD dwExpectedCompletionMilliseconds);
Параметры
dwExpectedCompletionMilliseconds
[in] Время в миллисекундах среда CLR должна ждать, прежде чем проверка, чтобы узнать, безопасно ли выгрузить профилировщик.
Возвращаемое значение
Этот метод возвращает следующие конкретные результаты HRESULT, а также ошибки HRESULT, которые указывают на сбой метода.
HRESULT | Description |
---|---|
S_OK | Запрос отсоединения является допустимым, и процедура отсоединения теперь продолжается в другом потоке. После полного выполнения отсоединения выдается событие ProfilerDetachSucceeded . |
E_CORPROF_E_CALLBACK3_REQUIRED | Профилировщик завершил попытку IUnknown::QueryInterface для интерфейса ICorProfilerCallback3 , который он должен реализовать для поддержки операции отсоединения. Попытка отсоединения не выполнялась. |
CORPROF_E_IMMUTABLE_FLAGS_SET | Отсоединение невозможно, так как профилировщик установил неизменяемые флаги во время запуска. Попытка отсоединения не выполнялась; профилировщик по-прежнему полностью присоединен. |
CORPROF_E_IRREVERSIBLE_INSTRUMENTATION_PRESENT | Отсоединение невозможно, так как профилировщик использовал инструментированные коды общего промежуточного языка (CIL) или вставленные enter /leave перехватчики. Попытка отсоединения не выполнялась; профилировщик по-прежнему полностью присоединен.Примечание Инструментированный CIL — это код, предоставляемый профилировщиком с помощью метода SetILFunctionBody . |
CORPROF_E_RUNTIME_UNINITIALIZED | Среда выполнения еще не была инициализирована в управляемом приложении. (То есть среда выполнения не была полностью загружена.) Этот код ошибки может быть возвращен при запросе отсоединения внутри метода ICorProfilerCallback::Initialize обратного вызова профилировщика. |
CORPROF_E_UNSUPPORTED_CALL_SEQUENCE | RequestProfilerDetach был вызван в неподдерживаемое время. Это происходит, если метод вызывается в управляемом потоке, но не из метода ICorProfilerCallback или из метода ICorProfilerCallback, который не допускает сборку мусора. Дополнительные сведения см. в разделе CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT. |
Замечания
При выполнении процедуры отсоединения поток отсоединения (поток, созданный специально для отсоединения профилировщика) периодически проверяет, все ли потоки вышли из кода профилировщика. Профилировщик должен предоставить оценку, как долго это должно происходить, с помощью параметра dwExpectedCompletionMilliseconds
. В качестве этого значения рекомендуется использовать обычное время, которое профилировщик проводит внутри любого конкретного метода ICorProfilerCallback*
; это значение не должно быть меньше половины максимального времени, которое профилировщик предполагает потратить.
Поток отсоединения использует dwExpectedCompletionMilliseconds
, чтобы определить продолжительность бездействия перед проверкой, был ли код обратного вызова профилировщика удален из всех стеков. Хотя сведения о следующем алгоритме могут измениться в будущих выпусках среды CLR, он иллюстрирует один из способов dwExpectedCompletionMilliseconds
, который можно использовать при определении того, когда можно безопасно выгрузить профилировщик. Поток отсоединения сначала находится в неактивном состоянии в течение dwExpectedCompletionMilliseconds
миллисекунд. Если после пробуждения от спящего режима среда CLR находит, что код обратного вызова профилировщика по-прежнему присутствует, отсоединение потока снова спит, на этот раз в два раза dwExpectedCompletionMilliseconds
миллисекунда. Если после выхода из этого второго неактивного состояния поток отсоединения обнаруживает, что код обратного вызова профилировщика все еще присутствует, то он бездействует в течение 10 минут перед еще одной проверкой. Поток отсоединения продолжает выполнять очередную проверку каждые 10 минут.
Если профилировщик указывает dwExpectedCompletionMilliseconds
как 0 (ноль), среда CLR использует значение по умолчанию 5000, которое означает, что проверка будет выполняться через 5 секунд, следующая проверка через 10 секунд, и затем каждые 10 минут соответственно.
Требования
Платформы: см. раздел Требования к системе.
Заголовок: CorProf.idl, CorProf.h
Библиотека: CorGuids.lib
версии платформа .NET Framework: Доступно с 4