HRESULT DE CORPROF_E_UNSUPPORTED_CALL_SEQUENCE
O HRESULT de CORPROF_E_UNSUPPORTED_CALL_SEQUENCE foi introduzido na.NET Framework versão 2.0. O .NET Framework versão 4 retorna esse HRESULT em dois cenários:
Quando um gerador de perfil de seqüestro forçosamente Redefine um thread registre contexto um momento arbitrário para que o thread tenta acessar estruturas que estão em um estado inconsistente.
Quando um gerador 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 discutidos nas seções a seguir.
Geradores de perfis de seqüestro.
(Esse cenário é basicamente um problema com geradores de perfis de seqüestro, embora existam casos onde os geradores de perfis de seqüestro de não podem ver esse HRESULT).
Nesse cenário, um gerador de perfil de seqüestro forçosamente redefine contexto do segmento de registro em um momento arbitrário para que o thread possa inserir o código do profiler ou reinserir o common language runtime (CLR) por meio de um ICorProfilerInfo método.
Muitas das identificações será que a API de criação de perfil fornece o ponto de estruturas de dados no CLR. Muitos ICorProfilerInfo chamadas simplesmente ler as informações de que essas estruturas de dados e passá-los de volta. No entanto, o CLR pode alterar coisas essas estruturas de como ele é executado, e ele pode usar bloqueios para fazê-lo. Suponha que o CLR foi já mantendo (ou tentar adquirir) um bloqueio no momento o profiler seqüestrado o thread. Se o thread reentrada CLR e tenta tomar mais bloqueios ou inspecionar as estruturas que estavam sendo modificado, essas estruturas talvez em um estado inconsistente. Facilmente, deadlocks e violações de acesso podem ocorrer em tais situações.
Em geral, quando um gerador de perfil sem seqüestro executa o código dentro de um ICorProfilerCallback método e chamadas em um ICorProfilerInfo método com parâmetros válidos, ele não deve bloqueio ou recebe uma violação de acesso. Por exemplo, o código de criador de perfil que seja executado dentro do ICorProfilerCallback::ClassLoadFinished método poderão lhe pedir informações sobre a classe chamando o ICorProfilerInfo2::GetClassIDInfo2 método. O código pode receber um HRESULT de CORPROF_E_DATAINCOMPLETE para indicar que a informação está disponível; No entanto, ele não será bloqueio ou recebe uma violação de acesso. Essa classe de chamadas para ICorProfilerInfo são chamadas síncronas, porque elas são feitas de um ICorProfilerCallback método.
No entanto, um segmento gerenciado que executa o código que não está contido um ICorProfilerCallback método é considerado como se estivesse 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 foi bloqueio, crash ou dar uma resposta inválida. A.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 um namespace ICorProfilerInfo funcionar de forma assíncrona, ele falhará com um HRESULT de CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.
Em geral, as chamadas assíncronas não são seguras. No entanto, os métodos a seguir são seguros e suportam especificamente chamadas assíncronas:
Para obter informações adicionais, consulte a entrada por isso que temos que CORPROF_E_UNSUPPORTED_CALL_SEQUENCE no blog da API de criação de perfil do CLR.
Disparo de coletas de lixo
Essa situação envolve um gerador de perfil que está sendo executado dentro de um método de retorno de chamada (por exemplo, uma da ICorProfilerCallback métodos) que proíbe a coleta de lixo. Se o profiler tentar chamar um método informativo (por exemplo, um método na ICorProfilerInfo interface) que podem disparar uma coleta de lixo, o método de informativo falhará com um HRESULT CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.
A tabela a seguir exibe os métodos de retorno de chamada que proíbam coletas de lixo e informativos métodos que podem disparar coletas de lixo. Se o profiler é executado dentro de um dos métodos de retorno de chamada listados e chama um dos métodos listados informativos, esse método informativo falhará com um HRESULT de CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.
Métodos de retorno de chamada que proíbam coletas de lixo |
Métodos informativos que disparam coletas de lixo |
---|---|
Consulte também
Referência
Interface de ICorProfilerCallback
Interface de ICorProfilerCallback2
Interface de ICorProfilerCallback3
Interface de ICorProfilerInfo2
Interface de ICorProfilerInfo3