Pergunta

Por isso, estou tentando bloquear um arquivo de armazenamento isolado no meu aplicativo C# cliente, para que várias cópias do meu aplicativo não possam acessá -lo ao mesmo tempo. Estou usando a seguinte sintaxe:

lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
lockStream.Lock(0, 0);

Este código faz com que meu aplicativo jogue uma NullReferenceException de dentro do método Filestream.lock da estrutura. Eu tentei usar um valor diferente de zero para o comprimento. Eu tentei escrever um byte no arquivo e depois travar exatamente esse byte. Não importa o que eu faça, essa mesma NullReferenceException continua me atormentando. Alguém sabe se isso é possível com armazenamento isolado?

Também estou procurando usar essa técnica em um aplicativo Silverlight também, o Silverlight suporta o bloqueio de arquivos? Os documentos do MSDN parecem indicar que não, mas eu vi esta postagem De um MVP C# que diz que sim.

ATUALIZAÇÃO: A Microsoft corrigiu o bug que enviei no Connect, mas não foi lançado na versão 4 da estrutura. Esperançosamente, deve estar disponível no próximo SP ou liberação completa.

Foi útil?

Solução

Parece um bug na estrutura. Eu posso estar errado, porque é realmente grande demais para ser verdade.

Olhando para o código-fonte do .NET 3.5 SP1 com o refletor, encontra-se que o isoladoStorageFileStream chama o construtor de base sem parâmetros (Filestream ()), o que resulta em uma classe base não-inicializada. O ISolatedStorageFileStream cria uma instância de uma transmissão de filtro e a usa em todos os métodos que ele substitui (escreva, leia, descarregue, procure, etc.). É estranho que não aproveite diretamente sua classe base.

Mas o bloqueio e o desbloqueio não são substituídos e eles precisam de um campo privado (_Handle) que ainda é nulo (porque o construtor usado é o sem parâmetros). Eles assumem que não é nulo e a desreferente e causam o NRE.

Para resumir, o bloqueio e o desbloqueio não são suportados (ou buggy).

Eu acho que você é forçado a usar outros métodos de bloqueio, como um mutex ou semáforo.

A implementação é a mesma no .NET 4 RC. No Silverlight, Lock, um desbloqueio não está presente (minhas desculpas por contradizer um MVP).

Outras dicas

Tente ter um valor maior que 0 para a quantidade de dados a ser bloqueada. Além disso, existem dados no fluxo, se não houver nada para travar esse problema ....

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top