Observable.FromAsyncPattern:传递给BeginInvoke的参数变为空

时间:2012-12-16 20:04:17

标签: windows-phone-7 linq-to-sql system.reactive

我正在尝试使用Rx在Windows Phone 7.5上为linq-to-sql编写异步DataContext。我的想法是在DataContext中定义一个方法:

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值为非null,并指向正确的实例。

这个事实有什么解释吗?如何克服它?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为你是以一种非常奇怪的方式解决这个问题。如果您想在后台运行代码并让它返回IObservable<T>(如任务),则应使用Observable.Start

IObservable<List<Fact>> factsFuture = Observable.Start(
    () => selectFacts(db).Select(query).ToList(), 
    Scheduler.ThreadPoolScheduler);
相关问题