Pergunta

Eu estou usando DataServices ADO.NET em um aplicativo do Silverlight e desde que as bibliotecas Silverlight não suportam a chamada ToList () no IQueryable eu pensei que poderia ser possível criar um método de extensão em torno deste chamado SilverlightToList (). Portanto, neste método que eu estou chamando o método BeginExecute no meu contexto, como mostrado abaixo:

            var result = context.BeginExecute<T>(currentRequestUri,null,context);
            result.AsyncWaitHandle.WaitOne();
            return context.EndExecute<T>(result).ToList();

O problema é que quando eu chamar o método WaitOne () Isso resulta em um impasse. É este uma limitação do DataServices ADO.NET no Silverlight? Existe talvez uma solução para isso?

Foi útil?

Solução 2

Eu tenho encontrado uma vez este post sobre o fórum MSDN que diz que qualquer triagem managed-> UnManaged-> Dirigido acontece no segmento interface do usuário que explica por que a chamada de método WaitOne está pendurado ...

Outras dicas

Eu consegui derrota (: P) o monstro assíncrona no Silverlight assim:

var ctx = new ModelEntities(new Uri("http://localhost:2115/Data.svc"));

ManualResetEvent m1 = new ManualResetEvent(false);
ManualResetEvent m2 = new ManualResetEvent(false);

var q1 = (DataServiceQuery<Department>)(from e in ctx.Department select e);
var q2 = (DataServiceQuery<Person>)(from e in ctx.Person select e);

Department[] r1 = null;
Person[] r2 = null;

q1.BeginExecute(r =>
{
    try { r1 = q1.EndExecute(r).ToArray(); }
    finally { m1.Set(); }
}, null);
q2.BeginExecute(r =>
{
    try { r2 = q2.EndExecute(r).ToArray(); }
    finally { m2.Set(); }
}, null);

ThreadPool.QueueUserWorkItem((o) =>
{
    WaitHandle.WaitAll(new WaitHandle[] { m1, m2 });
    // do your thing..
});

O ideea básica é a de gerar um segmento garçom (o último bloco), que teria referências aos objetos de espera. Não coloque a sua chamada WaitAll no método chamador / thread, porque isso irá resultar em um impasse como outros mencionado anteriormente neste site ou outros sites.

O impasse ocorre porque os fios não estão começando até as extremidades método e o método não termina porque a chamada espera WaitAll para a criança tópicos ao fim.

Não no meu caso acima no entanto, porque o WaitAll é em outro segmento.

PS:. Em vez do // faça a sua linha coisa Código lugar que usa o R1 e R2 capturado referências que detêm os dados ou nulo, se esse resultado falhou

Silverlight é provavelmente não vai gostar nada síncrona, porque ele é destinado para ser executado no navegador, e isso só pode ter um segmento para jogar com - e tem que compartilhar isso. E o único fio disponível para o anfitrião é o fornecido pelo navegador.

Todas as chamadas de serviço em Silverlight deve ser assíncrona. Então você tem que definir um retorno de chamada para obter o resultado - como este:

context.BeginExecute<T>(currentRequestUri, resultCallback, context);

private void resultCallback(IAsyncResult asyncResult)
{
    DataServiceContext context = asyncResult.AsyncState as DataServiceContext;
    var result = context.EndExecute<T>(asyncResult);
    // Do whatever you need with the result here
}

Aqui está uma boa referência na MSDN: http://msdn.microsoft.com/en- us / library / cc838191 (VS.95) .aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top