CORPROF_E_UNSUPPORTED_CALL_SEQUENCE (HRESULT)
El HRESULT CORPROF_E_UNSUPPORTED_CALL_SEQUENCE se introdujo en la versión 2.0 de .NET Framework. .NET Framework versión 4 devuelve este HRESULT en dos escenarios:
Cuando un generador de perfiles de usurpación restablece de forma forzada un contexto de registro de un subproceso en un momento arbitrario, de forma que el subproceso intente tener acceso a las estructuras que están en un estado incoherente.
Cuando un generador de perfiles intenta llamar a un método informativo que activa 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 tratan en las siguientes secciones.
Generadores de perfiles de usurpación
(Este escenario es principalmente un problema con los generadores de perfiles de usurpación aunque hay casos donde los generadores de perfiles no usurpadores puede ver este HRESULT.)
En este escenario, un generador de perfiles de usurpación restablece de forma forzada el contexto del registro de un subproceso en un momento arbitrario para que el subproceso pueda escribir el código del generador de perfiles o vuelve a escribir el 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 señalan a estructuras de datos del CLR. Muchas llamadas ICorProfilerInfo simplemente leen información de estas estructuras de datos y las devuelve. Sin embargo, el CLR podría cambiar las cosas en esas estructuras cuando se ejecuta, y podría usar bloqueos para ello. Supongamos que el CLR ya contenía (o intentaba adquirir) un bloqueo en el momento que el generador de perfiles asaltaba el subproceso. Si el subproceso vuelve a escribir en el CLR e intenta tomar más bloqueos o inspeccionar estructuras que estaban en proceso de modificarse, estas estructuras podrían estar en un estado incoherente. Los interbloqueos e infracciones de acceso se pueden producir con facilidad en tales situaciones.
En general, cuando un generador de perfiles no usurpadores ejecuta el código dentro de un método ICorProfilerCallback y llama a un método ICorProfilerInfo con parámetros válidos, no debe haber interbloqueo 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 solicitar información sobre la clase llamando al método ICorProfilerInfo2::GetClassIDInfo2. El código podría recibir un HRESULT CORPROF_E_DATAINCOMPLETE para indicar que la información no está disponible; sin embargo, no se generará un interbloqueo ni se recibirá una infracción de acceso. Se llama a esta clase de llamadas en ICorProfilerInfo sincrónicas, porque se generan a partir de un método ICorProfilerCallback.
Sin embargo, se considera que un subproceso administrado que ejecuta código que no está dentro de un método ICorProfilerCallback está realizando una llamada asincrónica. En .NET Framework 1, resultaba difícil determinar lo que podría pasar en una llamada asincrónica. La llamada podría producir interbloqueos, bloqueos o proporcionar una respuesta no válida. La versión 2.0 de .NET Framework introdujo algunas comprobaciones simples para ayudarle a evitar este problema. En .NET Framework 2.0, si llama de forma asincrónica a una función ICorProfilerInfo no segura, se produce un error con un HRESULT de CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.
En general, las llamadas asincrónicas no son seguras. Sin embargo, los siguientes métodos son seguros y son específicamente compatibles con las llamadas asincrónicas:
Para obtener información adicional, vea entrada Why we have 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 está ejecutando 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 activar una recolección de elementos no utilizadosados, se produce un error en el método informativo con un HRESULT de CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.
En la siguiente tabla se muestran los método de devolución de llamada que prohíben las recolecciones de elementos no utilizados y los métodos informativos que pueden desencadenar las recolecciones de elementos no utilizados. Si el generador de perfiles se ejecuta dentro de uno de los método de devolución de llamada enumerados y llama a uno de los métodos informativos enumerados, ese método informativo produce un error con un HRESULT de CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.
Métodos de devolución de llamada que prohíben las recolecciones de elementos no utilizados |
Métodos informativos que activan la recolección de elementos no utilizados |
---|---|
Vea también
Referencia
ICorProfilerCallback (Interfaz)
ICorProfilerCallback2 (Interfaz)
ICorProfilerCallback3 (Interfaz)
Otros recursos
Interfaces para generación de perfiles
Generación de perfiles (Referencia de la API no administrada)