2012-12-16 49 views
0

我正嘗試在Windows Phone 7.5上使用Rx爲linq-to-sql編寫異步DataContext。我的想法是定義在DataContext的一個方法:Observable.FromAsyncPattern:傳遞給BeginInvoke的參數被取消爲零

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(); 

我面臨的問題是很奇怪的。當實際調用客戶端選擇器(from item in database.Facts select item)時,其上下文中的database參數爲空!因此,我顯然得到了NullReferenceException。但是,調用selectFacts時,db值非空,並指向正確的實例。

有沒有解釋這個事實?如何克服它?

在此先感謝。

回答

0

我想你會以一種非常奇怪的方式去解決這個問題。如果你想在後臺運行的代碼,並將它返回一個IObservable<T>(如任務),你應該使用Observable.Start

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

好吧,沒關係,我發現瞭如何正確地做到這一點,你的方法工作。仍然想知道我的錯在哪裏... – Haspemulator