【问题标题】:Observable.FromAsyncPattern: parameter passed to BeginInvoke gets nulledObservable.FromAsyncPattern:传递给 BeginInvoke 的参数为空
【发布时间】:2012-12-16 20:04:16
【问题描述】:

我正在尝试使用 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 的值是非空的,并且指向正确的实例。

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    我认为你正在以一种非常奇怪的方式处理这个问题。如果你想在后台运行代码并让它返回一个IObservable&lt;T&gt;(如Task),你应该使用Observable.Start

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

    【讨论】:

    • 好吧,没关系,我找到了正确的方法,而且你的方法很有效。仍然想知道我的问题是什么......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多