문제

실버 라이트 애플리케이션에서 ado.net DataServices를 사용하고 있으며 Silverlight 라이브러리는 iQueryable에서 Tolist () 호출을 지원하지 않기 때문에 SilverlightTolist ()라는이 주위에 확장 방법을 만들 수 있다고 생각했습니다. 이 방법에서는 아래와 같이 내 컨텍스트에서 BeginexeCute 메소드를 호출합니다.

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

문제는 Waitone () 메소드를 호출하면 교착 상태가 발생한다는 것입니다. 이것은 Silverlight에서 Ado.net DataServices의 한계입니까? 이것에 대한 해결 방법이 있습니까?

도움이 되었습니까?

해결책 2

나는 그 이후로 발견했다 이 게시물 MSDN 포럼에서 관리되지 않은-관리되지 않은 마샬링은 UI 스레드에서 발생한다고 말합니다.

다른 팁

나는 Silverlight의 비동기 괴물을 그렇게 물리 쳤다.

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..
});

기본 Ideea는 대기 개체에 대한 참조를 갖는 웨이터 스레드 (마지막 블록)를 생성하는 것입니다. 이 사이트 나 다른 사이트에서 앞서 언급 한 것처럼 교착 상태가 발생하기 때문에 발신자 메소드 / 스레드에 WaitAll 호출을하지 마십시오.

교착 상태는 메소드가 끝날 때까지 스레드가 시작되지 않기 때문에 발생합니다. Waitall 호출이 하위 스레드가 종료 될 때까지 대기하므로 메소드가 종료되지 않기 때문입니다.

그러나 내 경우에는 위의 waitall이 다른 스레드에 있기 때문에 위의 경우가 아닙니다.

추신 : // r1 및 r2 캡처 된 참조를 사용하는 // do do your times line place 코드 대신 결과가 실패한 경우 데이터 또는 null을 보유 할 수 있습니다.

Silverlight는 아마도 브라우저에서 실행되기 위해서는 동기식을 좋아하지 않을 것이며, 하나의 스레드 만 가지고 놀 수 있습니다. 그리고 그것을 공유해야합니다. 호스트에서 사용할 수있는 유일한 스레드는 브라우저에서 제공하는 스레드입니다.

Silverlight의 모든 서비스 호출은 비동기식이어야합니다. 따라서 결과를 얻으려면 콜백을 정의해야합니다.

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
}

다음은 MSDN에 대한 좋은 참조입니다. http://msdn.microsoft.com/en-us/library/cc838191(vs.95).aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top