CORPROF_E_UNSUPPORTED_CALL_SEQUENCE (HRESULT)
El CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT se introdujo en .NET Framework versión 2.0. .NET Framework 4 devuelve este HRESULT en dos escenarios:
Cuando un generador de perfiles de secuestro restablece forzosamente el contexto de registro de un subproceso en un momento arbitrario para que el subproceso intente acceder a las estructuras que están en un estado incoherente.
Cuando un generador de perfiles intenta llamar a un método informativo que desencadena la recolección de elementos no utilizados desde un método de devolución de llamada que prohíbe la recolección de elementos no utilizados.
Estos dos escenarios se describen en las secciones siguientes.
Secuestradores de perfiles
(Este escenario es principalmente un problema con los generadores de perfiles de secuestro, aunque hay casos en los que los generadores de perfiles no secuestradores pueden ver este HRESULT).
En este escenario, un generador de perfiles secuestrador restablece forzosamente el contexto de registro de un subproceso en un momento arbitrario para que el subproceso pueda escribir código del generador de perfiles o volver a escribir Common Language Runtime (CLR) a través de un método ICorProfilerInfo.
Muchos de los identificadores que proporciona la API de generación de perfiles apuntan a estructuras de datos en CLR. Muchas llamadas ICorProfilerInfo
simplemente leen información de estas estructuras de datos y las devuelven. Sin embargo, CLR podría cambiar las cosas de esas estructuras a medida que se ejecuta y podría usar bloqueos para hacerlo. Supongamos que CLR ya estaba manteniendo (o intentando adquirir) un bloqueo en el momento en que el generador de perfiles secuestró el subproceso. Si el subproceso vuelve a escribir CLR e intenta tomar más bloqueos o inspeccionar estructuras que estaban en proceso de modificación, estas estructuras podrían estar en un estado incoherente. Los interbloqueos y las infracciones de acceso pueden producirse fácilmente en tales situaciones.
En general, cuando un generador de perfiles sin secuestro ejecuta código dentro de un método ICorProfilerCallback y llama a un método ICorProfilerInfo
con parámetros válidos, no debe interbloquear ni recibir una infracción de acceso. Por ejemplo, el código del generador de perfiles que se ejecuta dentro del método ICorProfilerCallback::ClassLoadFinished puede pedir información sobre la clase llamando al método ICorProfilerInfo2::GetClassIDInfo2. El código puede recibir un CORPROF_E_DATAINCOMPLETE HRESULT para indicar que la información no está disponible. Sin embargo, no se interbloqueará ni recibirá una infracción de acceso. Estas llamadas a ICorProfilerInfo
se consideran sincrónicas, ya que se realizan a partir de un método ICorProfilerCallback
.
Sin embargo, un hilo gestionado que ejecuta código que no está dentro de un método ICorProfilerCallback
que se considera que está haciendo una llamada asíncrona. En .NET Framework versión 1, era difícil determinar lo que podría ocurrir en una llamada asincrónica. La llamada podría interbloqueo, bloqueo o dar una respuesta no válida. .NET Framework versión 2.0 introdujo algunas comprobaciones sencillas para ayudarle a evitar este problema. En .NET Framework 2.0, si llama a una función no segura ICorProfilerInfo
de forma asincrónica, se produce un error con un CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
En general, las llamadas asincrónicas no son seguras. Sin embargo, los métodos siguientes son seguros y admiten específicamente llamadas asincrónicas:
Para obtener más información, consulte la entrada Por qué tenemos CORPROF_E_UNSUPPORTED_CALL_SEQUENCE en el blog de LA API de generación de perfiles de CLR.
Desencadenar recolecciones de elementos no utilizados
Este escenario implica un generador de perfiles que se ejecuta dentro de un método de devolución de llamada (por ejemplo, uno de los métodos ICorProfilerCallback
) que prohíbe la recolección de elementos no utilizados. Si el generador de perfiles intenta llamar a un método informativo (por ejemplo, un método en la interfaz ICorProfilerInfo
) que podría desencadenar una recolección de elementos no utilizados, se produce un error en el método informativo con un CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
En la tabla siguiente se muestran los métodos de devolución de llamada que prohíben las recolecciones de elementos no utilizados y los métodos informativos que pueden desencadenar recolecciones de elementos no utilizados. Si el generador de perfiles se ejecuta dentro de uno de los métodos de devolución de llamada enumerados y llama a uno de los métodos informativos enumerados, se produce un error en ese método informativo con un CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
Métodos de devolución de llamada que prohíben la recolección de elementos no utilizados | Métodos informativos que desencadenan recolecciones de elementos no utilizados |
---|---|
ThreadAssignedToOSThread ExceptionUnwindFunctionEnter ExceptionUnwindFunctionLeave ExceptionUnwindFinallyEnter ExceptionUnwindFinallyLeave ExceptionCatcherEnter RuntimeSuspendStarted RuntimeSuspendFinished RuntimeSuspendAborted RuntimeThreadSuspended RuntimeThreadResumed MovedReferences ObjectReferences ObjectsAllocatedByClass RootReferences2 HandleCreated HandleDestroyed GarbageCollectionStarted GarbageCollectionFinished |
GetILFunctionBodyAllocator SetILFunctionBody SetILInstrumentedCodeMap ForceGC GetClassFromToken GetClassFromTokenAndTypeArgs GetFunctionFromTokenAndTypeArgs GetAppDomainInfo EnumModules RequestProfilerDetach GetAppDomainsContainingModule |