propriedades persistentes - de forma assíncrona

votos
0

Em ASP.NET clássico eu persistir dados extraídos de um serviço web na propriedade classe base como segue:

   private string m_stringData;
   public string _stringData
    {  get {
            if (m_stringData==null)
                {
                    //fetch data from my web service
                    m_stringData = ws.FetchData()
                }
            return m_stringData;
       }
   }

Desta forma, eu poderia simplesmente fazer referência a _stringData e saber que eu sempre obter os dados que eu estava atrás (talvez às vezes eu usaria Estado da sessão como uma loja em vez de uma variável de membro privado).

No Silverlight com um WCF eu poderia optar por usar armazenamento isolado como meu mecanismo de persistência, mas a chamada de serviço não pode ser feito assim, porque um serviço WCF tem que ser chamado de forma assíncrona.

Como eu tanto pode chamar o serviço de chamada e recuperar a resposta em um método?

Obrigado, Mark

Publicado 09/03/2009 em 13:03
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Obrigado pela vossa ajuda tvanfosson. Eu segui o seu código e também encontraram uma solução pseudo semelhante que atende as minhas necessidades exatamente usando uma expressão lambda:

private string m_stringData;
public string _stringData{    
get
    {
   //if we don't have a list of departments, fetch from WCF
        if (m_stringData == null)
        {
            StringServiceClient client = new StringServiceClient();
            client.GetStringCompleted +=
                (sender, e) =>
                {
                    m_stringData = e.Result;
                };
            client.GetStringAsync();
        }
        return m_stringData;
    }
}

EDITAR

Oops ... na verdade isso não quer trabalhar :-( acabei fazendo as chamadas de forma assíncrona e alterando a minha lógica de programação para usar padrão MVVM e mais vinculativo.

Respondeu 10/03/2009 em 10:23
fonte usuário

votos
0

Em seu método, chamar o serviço de chamada de forma assíncrona e registrar um callback que define um sinalizador. Depois de ter invocado o método, digite um ocupado / esperar circuito verificando a bandeira periodicamente até que a bandeira está definido, indicando que os dados tenham sido devolvidos. O retorno de chamada deve definir o campo de apoio para o seu método e você deve ser capaz de devolvê-lo assim que detectar a bandeira foi definido indicando sucesso. Você também vai precisar se preocupar com o fracasso. Se é possível obter várias chamadas para o seu método de segmentos diferentes, você também vai precisar usar algum bloqueio para fazer thread-safe seu código.

EDITAR

Na verdade, o ocupado / esperar circuito provavelmente não é o caminho a percorrer se o serviço web suporta semântica BeginGetData / EndGetData. Eu tinha uma olhada em alguns dos meu código onde eu fazer algo semelhante e eu uso WaitOne esperar simplesmente no resultado assíncrono e depois recuperá-lo. Se o seu serviço web não suporta este, em seguida, lançar um Thread.Sleep - digamos para 50-100ms - em seu ciclo de espera para dar tempo para outros processos para executar.

Exemplo do meu código:

IAsyncResult asyncResult = null;
try
{
    asyncResult = _webService.BeginGetData( searchCriteria, null, null );
    if (asyncResult.AsyncWaitHandle.WaitOne( _timeOut, false ))
    {
        result = _webService.EndGetData( asyncResult );
    }
}
catch (WebException e)
{
    ...log the error, clean up...
}
Respondeu 09/03/2009 em 13:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more