CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT
HRESULT CORPROF_E_UNSUPPORTED_CALL_SEQUENCE была введена в .NET Framework версии 2.0. .NET Framework 4 возвращает это значение HRESULT в двух случаях:
Когда захватывающий профилировщик принудительно сбрасывает контекст реестра потока в произвольный момент таким образом, что поток пытается получить доступ к структурам, которые находятся в несогласованном состоянии.
При попытке профилировщика вызвать информационный метод, который инициирует сбор мусора из метода обратного вызова, запрещающего сборку мусора.
Эти два случая рассматриваются в следующих разделах.
Захватывающие профилировщики
(Этот сценарий является главным образом проблемой с захватывающими профилировщиками, хотя существуют случаи, где не захватывающие профилировщики могут просматривать данный HRESULT).
В этом случае захватывающий профилировщик принудительно сбрасывает контекст регистра потока в произвольный момент, так что поток может ввести код профилировщика или заново войти в CLR через метод ICorProfilerInfo.
Многие из идентификаторов, которые интерфейс API для профилирования предоставляет, указывают на структуры данных в среде CLR. Многие вызовы ICorProfilerInfo просто считывают данные из этих структур данных и передают их обратно. Однако среда CLR может изменять вещи в этих структурах по мере выполнения, и может использовать блокировки для этого. Предположим, что среда CLR уже удерживает (или пытается получить) блокировку во время захвата потока профилировщиком. Если поток повторно входит в среду CLR и пытается получить несколько блокировок или проверять структуры, которые были в процессе изменения, эти структуры могут быть в несогласованном состоянии. Взаимоблокировки и нарушения прав доступа может легко возникать в таких ситуациях.
В общем случае при выполнении кода незахватывающим профилировщиком внутри метода ICorProfilerCallback и вызове им метода ICorProfilerInfo с допустимыми параметрами профилировщик не должен взаимоблокироваться или получать нарушение прав доступа. Например, код профилировщика, выполняемый внутри метода ICorProfilerCallback::ClassLoadFinished, может запросить сведения о классе путем вызова метода ICorProfilerInfo2::GetClassIDInfo2. Код может получать CORPROF_E_DATAINCOMPLETE HRESULT, чтобы указать, что сведения недоступны; однако он не будет взаимоблокироваться или получать нарушение прав доступа. Этот класс вызовов в ICorProfilerInfo называются синхронным, так как состоят из метода ICorProfilerCallback.
Однако управляемый поток, выполняющий код, не в методе ICorProfilerCallback считается осуществляющим асинхронный вызов. В .NET Framework версии 1 было сложно определить, что может произойти в асинхронный вызове. Вызов может взаимоблокироваться, зависнуть или дать недопустимый ответ. В .NET Framework версии 2.0 появились некоторые простые проверки, чтобы избежать этой проблемы. В .NET Framework 2.0 если вызвать небезопасную функцию ICorProfilerInfo асинхронно, происходит сбой с CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
Как правило асинхронные вызовы не являются безопасными. Однако следующие методы являются безопасными и в частности поддерживают асинхронные вызовов:
Дополнительные сведения см. в публикации Why we have CORPROF_E_UNSUPPORTED_CALL_SEQUENCE блога об API-интерфейсах профилирования в среде CLR.
Запуск коллекции мусора
Этот сценарий включает профилировщик, который выполняется внутри метода обратного вызова (например, один из методов ICorProfilerCallback), который запрещает сборку мусора. Если профилировщик пытается вызывать информационный метод (например, метод в интерфейсе ICorProfilerInfo), который может запустить сбор мусора, происходит сбой метода информационного с CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
В следующей таблице показаны методы обратного вызова, запрещающие сбор мусора, и информационные методы, которые могут запустить сбор мусора. Если профилировщик выполняется внутри одного из перечисленных методов обратного вызова и вызывает один из перечисленных информационные методов, происходит сбой этого информационного метода с CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
Методы обратного вызова, запрещающие сборку мусора |
Информационные методы, которые запускают сборки мусора |
---|---|
См. также
Ссылки
Интерфейс ICorProfilerCallback
Интерфейс ICorProfilerCallback2
Интерфейс ICorProfilerCallback3
Другие ресурсы
Профилирование (справочник по неуправляемым интерфейсам API)