2012-12-16 2 views
0

Rx를 사용하여 Windows Phone 7.5에서 linq-to-sql 용 비동기 DataContext를 작성하려고합니다.Observable.FromAsyncPattern : BeginInvoke에 전달 된 매개 변수가 null이 됨

IObservable<List<Fact>> GetFacts(Func<MyDataContext, IQueryable<Fact>> selector) 
    { 
     var selectFacts = Observable.FromAsyncPattern<MyDataContext, IQueryable<Fact>>(selector.BeginInvoke, selector.EndInvoke); 
     return selectFacts(db).Select((query) => query.ToList());// db variable is MyDataContext instance, and is not null during the call or later 
    } 

이 방법은 다음과 같이 클라이언트 코드에서 호출해야합니다 :

var q = GetFacts((database) => from item in database.Facts select item) 
    .ObserveOnDispatcher() 
    .Do((facts) => MessageBox.Show(facts.Count.ToString())) 
    .Subscribe(); 

내가 직면하고있어 문제는 매우 이상하다 내 생각은 DataContext에있는 방법을 정의하는 것입니다. 클라이언트 선택기 (from item in database.Facts select item)가 실제로 호출되면 해당 컨텍스트의 database 매개 변수는 null입니다! 따라서 분명히 NullReferenceException이 발생합니다. 그러나 selectFacts이 호출되면 db 값은 null이 아니며 올바른 인스턴스를 가리 킵니다.

이 사실에 대한 설명이 있습니까? 그것을 극복하는 방법?

미리 감사드립니다.

답변

0

당신은 매우 이상한 방식으로이 문제에 대해 생각합니다. 당신이 백그라운드에서 코드를 실행하고 싶은 경우 그것이이 IObservable<T> (작업 등), 당신은 Observable.Start 사용해야 반환 :

IObservable<List<Fact>> factsFuture = Observable.Start(
    () => selectFacts(db).Select(query).ToList(), 
    Scheduler.ThreadPoolScheduler); 
+0

좋아, 결코 마음, 내가 제대로 할, 당신의 접근 방식이 작동 방법을 발견 . 아직도 내게 뭐가 잘못 됐는지 궁금해서 ... – Haspemulator

관련 문제