我正在尝试使用 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
参数为 null!因此,我显然得到了NullReferenceException。但是,当调用selectFacts
时,db
值为非 null,并指向正确的实例。
对这个事实有什么解释吗?如何克服它?
提前谢谢。
我认为你以一种非常奇怪的方式去做这件事。如果要在后台运行代码并使其返回IObservable<T>
(如 Task),则应使用 Observable.Start
:
IObservable<List<Fact>> factsFuture = Observable.Start(
() => selectFacts(db).Select(query).ToList(),
Scheduler.ThreadPoolScheduler);