locked
É possível fazer uso do IsolatedStorage com o Action e callback? RRS feed

  • Pergunta

  • Olá,

    Eu já vi algumas implementações de dataservices que utilizam Action<IList<T>, Excepetion> e queria saber como utilizar callback com o isolatedstorage e, se é possível fazer uso do isolatedstorage de forma assincrona?

    segunda-feira, 2 de abril de 2012 22:49

Respostas

  • Olá Gustavo,

    Sim, dá pra fazer, mas não sei o quanto de performance você vai ganhar com isso.

    Primeiro, vamos criar uma função que busque um arquivo do isolated storage:

    private byte[] Load(string file) {
    	using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) {
    		using (IsolatedStorageFileStream stream = storage.OpenFile(file, FileMode.Open)) {
    			byte[] buffer = new byte[stream.Length];
    			stream.Read(buffer, 0, (int) stream.Length);
    			return buffer;
    		}
    	}
    }


    Agora, vamos criar um helper para chamar qualquer função de forma assíncrona:

    public class Worker {
    	public static void RunAsync<T>(Func<T> method, Action<T> onSuccess, Action<Exception> onError) {
    		ThreadPool.QueueUserWorkItem(o => {
    			try {
    				T resp = method.Invoke();
    				onSuccess.Invoke(resp);
    			}
    			catch (Exception ex) {
    				onError.Invoke(ex);
    			}
    		});
    	}
    }

    Crie um método para quando der certo e um para quando der exception:

    private void OnLoadOk(byte[] obj) {
    	//faça algo com o arquivo carregado
    }
    
    private void OnLoadError(Exception obj) {
    	//tratar exception
    }

    E agora podemos chamar essa função assim:

    Worker.RunAsync(() => Load("meuArquivo"), OnLoadOk, OnLoadError);

    Espero que ajude,

    André

     


    - André Carlucci - Way2 Technology - twitter/andrecarlucci - andrecarlucci.com

    • Marcado como Resposta Thiago Monaco sexta-feira, 13 de abril de 2012 14:20
    domingo, 8 de abril de 2012 23:44

Todas as Respostas

  • No Windows phone o acesso ao IsolatedStorage é totalmente sincrono, e como tal não há vantagens reais em usar o modelo de callback assincrono... do pouco que vi do Windows 8 aí sim temos acesso assincrono ao Storage, por isso pode ser que numa futura versão do Windows Phone também ai esteja presente! :)

    Pedro Lamas
    DevScope | Senior Software Development Engineer & WP7 Development Speaker
    www.pedrolamas.com | @pedrolamas

    terça-feira, 3 de abril de 2012 16:00
  • Olá Gustavo

    Dê uma olhada no link abaixo, pode ser útil.

    Usando armazenamento isolado em uma aplicação no Windows Phone

    Um abraço.

    _______________________

    Thiago Oliveira

    @wp7boy

    www.windowsphone-dev.net

    quarta-feira, 4 de abril de 2012 00:57
  • Olá Gustavo,

    Sim, dá pra fazer, mas não sei o quanto de performance você vai ganhar com isso.

    Primeiro, vamos criar uma função que busque um arquivo do isolated storage:

    private byte[] Load(string file) {
    	using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) {
    		using (IsolatedStorageFileStream stream = storage.OpenFile(file, FileMode.Open)) {
    			byte[] buffer = new byte[stream.Length];
    			stream.Read(buffer, 0, (int) stream.Length);
    			return buffer;
    		}
    	}
    }


    Agora, vamos criar um helper para chamar qualquer função de forma assíncrona:

    public class Worker {
    	public static void RunAsync<T>(Func<T> method, Action<T> onSuccess, Action<Exception> onError) {
    		ThreadPool.QueueUserWorkItem(o => {
    			try {
    				T resp = method.Invoke();
    				onSuccess.Invoke(resp);
    			}
    			catch (Exception ex) {
    				onError.Invoke(ex);
    			}
    		});
    	}
    }

    Crie um método para quando der certo e um para quando der exception:

    private void OnLoadOk(byte[] obj) {
    	//faça algo com o arquivo carregado
    }
    
    private void OnLoadError(Exception obj) {
    	//tratar exception
    }

    E agora podemos chamar essa função assim:

    Worker.RunAsync(() => Load("meuArquivo"), OnLoadOk, OnLoadError);

    Espero que ajude,

    André

     


    - André Carlucci - Way2 Technology - twitter/andrecarlucci - andrecarlucci.com

    • Marcado como Resposta Thiago Monaco sexta-feira, 13 de abril de 2012 14:20
    domingo, 8 de abril de 2012 23:44