CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT
O CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT foi introduzido no .NET Framework versão 2.0. .NET Framework 4 retorna este HRESULT em dois cenários:
Quando um criador de perfil de sequestro redefine à força o contexto de registro de um thread em um momento arbitrário para que o thread tente acessar estruturas que estão em um estado inconsistente.
Quando um criador de perfil tenta chamar um método informativo que dispara a coleta de lixo de um método de retorno de chamada que proíbe a coleta de lixo.
Esses dois cenários são explicados nas seções a seguir.
Criadores de perfil de sequestro
(Esse cenário é principalmente um problema com criadores de perfil de sequestro, embora haja casos em que os criadores de perfil que não seja de sequestro podem ver esse HRESULT.)
Nesse cenário, um criador de perfil de sequestro redefine à força o contexto de registro de um thread em um momento arbitrário para que o thread possa inserir o código do criador de perfil ou reentrar no CLR (Common Language Runtime) por meio de um método ICorProfilerInfo.
Muitas das IDs que a API de criação de perfil fornece apontam para estruturas de dados no CLR. Muitas chamadas ICorProfilerInfo
apenas leem informações dessas estruturas de dados e as transmitem de volta. No entanto, o CLR pode alterar as coisas nessas estruturas conforme ele é executado e pode usar bloqueios para fazê-lo. Suponha que o CLR já estava segurando (ou tentando adquirir) um bloqueio no momento em que o criador de perfil sequestrou o thread. Se o thread reentra no CLR e tenta obter mais bloqueios ou inspecionar estruturas que estavam em processo de modificação, essas estruturas podem estar em um estado inconsistente. Deadlocks e violações de acesso podem ocorrer facilmente nessas situações.
Em geral, quando um criador de perfil que não seja de sequestro executa código dentro de um método ICorProfilerCallback e chama um método ICorProfilerInfo
com parâmetros válidos, ele não deve fazer deadlock nem receber uma violação de acesso. Por exemplo, o código do criador de perfil executado dentro do método ICorProfilerCallback::ClassLoadFinished pode solicitar informações sobre a classe chamando o método ICorProfilerInfo2::GetClassIDInfo2. O código pode receber uma CORPROF_E_DATAINCOMPLETE HRESULT para indicar que as informações não estão disponíveis. No entanto, ele não receberá um deadlock nem receberá uma violação de acesso. Essas chamadas ICorProfilerInfo
são consideradas síncronas, pois são feitas de um método ICorProfilerCallback
.
No entanto, um thread gerenciado que executa um código que não está dentro de um método ICorProfilerCallback
é considerado como fazendo uma chamada assíncrona. No .NET Framework versão 1, era difícil determinar o que poderia acontecer em uma chamada assíncrona. A chamada pode travar, falhar ou dar uma resposta inválida. O .NET Framework versão 2.0 introduziu algumas verificações simples para ajudá-lo a evitar esse problema. No .NET Framework 2.0, se você chamar uma função ICorProfilerInfo
não segura de forma assíncrona, ela falhará com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
Em geral, chamadas assíncronas não são seguras. No entanto, os seguintes métodos são seguros e dão suporte especificamente a chamadas assíncronas:
Para obter mais informações, consulte a entrada Por que temos CORPROF_E_UNSUPPORTED_CALL_SEQUENCE no blog da API de Criação de Perfil CLR.
Disparando coletas de lixo
Esse cenário envolve um criador de perfil que está em execução dentro de um método de retorno de chamada (por exemplo, um dos métodos ICorProfilerCallback
) que proíbe a coleta de lixo. Se o criador de perfil tentar chamar um método informativo (por exemplo, um método na interface ICorProfilerInfo
) que pode disparar uma coleta de lixo, o método informativo falhará com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.
A tabela a seguir exibe os métodos de retorno de chamada que proíbem coletas de lixo e métodos informativos que podem disparar coletas de lixo. Se o criador de perfil for executado dentro de um dos métodos de retorno de chamada listados e chamar um dos métodos informativos listados, esse método informativo falhará com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.