Mais

É permitido atualizar recursos após o lançamento do cursor do recurso?

É permitido atualizar recursos após o lançamento do cursor do recurso?


No ArcObjects, é permitido modificar e atualizar um recurso após o lançamento do cursor do recurso (que foi usado para recuperar o recurso)?

Ou seja, os recursos de alguma forma retêm um link para o cursor por meio do qual foram recuperados?

// recupera um recurso por meio de um cursor de recurso de reciclagem: IFeatureClass featureClass =…; IFeatureCursor featureCursor = featureClass.Search (nada, verdadeiro); IFeature feature = featureCursor.NextFeature (); // libere o cursor de recurso: Marshal.FinalReleaseComObject (featureCursor); // PERGUNTA: o recurso ainda pode ser modificado e atualizado? feature.Value (…) =…; feature.Store ();
  • Estou programando com as versões 9.3 e 10 do ArcGIS.
  • Faz diferença se o cursor é reciclável ou não reciclável?

P.S .: Eu tentei isso nas versões 9.3 e 10 do ArcGIS, e parece que trabalhar bem; no entanto, isso não significa que isso vai sempre trabalho, nem que isso deve ser feito. Não encontrei nenhuma dica sobre esse problema na documentação da API online da ESRI.


O principal é se o cursor é reciclável ou não reciclável.

Cursores de reciclagem entregar a mesma instância para cada recurso, com valores diferentes em cada iteração. Ou seja, eles reciclam a mesma instância. Isso é feito para ganhos de desempenho, uma vez que menos objetos são instanciados. Isso também significa que você geralmente não pode manter a referência aos seus objetos de banco de dados geográficos recuperados com cursores de reciclagem. Como tal, os cursores de reciclagem são não é adequado se você fizer atualizações subsequentes dos recursos.

Cursores de não reciclagem, por outro lado, instancia uma instância separada para cada recurso que eles retornam. Você pode manter referências a seus objetos em uma sessão de edição e realizar atualizações sobre eles por meio de chamadasLoja.

Em seu trecho de código particular, não há diferença, já que você está recuperando apenas um único recurso. Se você recuperasse dois e mantivesse referência a cada um deles, ambas as referências apontariam para o mesmo objeto (o último recuperado).

Definitivamente, veja a discussão na parte inferior de IFeatureClass.Search. Eu também recomendo que você verifique a visão geral da biblioteca Geodatabase.


Atualização, conforme comentado abaixo: As instâncias do recurso não fazem referência ao cursor usado para recuperá-los, portanto, não estão de forma alguma vinculados a ele. Portanto, sim, você pode se referir a um recurso se o cursor não existir mais, mas (se você ignorar o cenário específico com apenas um recurso sendo obtido), obviamente, isso só faz sentido para cursores que não são reciclados.


Como @ petr-krebs mencionou, os objetos de recurso não fazem referência a seus cursores. Contudo, o estado do banco de dados é conectado às alças do cursor e o comportamento dos objetos de recurso depende do estado do banco de dados.

Foi meu entendimento que embora você tenha um identificador para um cursor de banco de dados, o banco de dados garante "consistência e isolamento" nas transações (definido aqui, conforme descrito por @ ragi-yaser-burhum (perfil) em relação ao desempenho do ArcObjects aqui). Portanto, se você liberar o identificador antes de realizar as atualizações e perder essas garantias, maio seja possível colocar o banco de dados em um estado inválido.

Isso pode ter um sério impacto nas operações em um ambiente ArcSDE movimentado. No entanto, minha experiência é principalmente com bancos de dados geográficos de arquivos, onde apenas um processo pode gravar em uma tabela por vez. Eu uso um método de extensão em cursores (sem reciclagem) para buscar todas as IFeatures em uma Lista <> e solto o cursor bem antes de editar. Nunca observei nenhum comportamento inconsistente com isso.

Eu poderia usar um pouco mais de clareza neste tópico.


Assista o vídeo: Jak zmienić kursor myszy w Windows 10