【发布时间】:2013-11-17 08:59:14
【问题描述】:
我有一个已填充的数据库目录和一个可用于检索对象的游标。这个目录显然可能非常大,我想做的是使用 ReactiveUI 来缓冲数据,同时保持 UI 数据绑定和响应式。我按照here 的步骤将我的IEnumerable 翻译成IObservable,如下所示:
public class CatalogService
{
...
public IObservable<DbObject> DataSource
{
get
{
return Observable.Create<DbObject>(obs =>
{
var cursor = Database.Instance.GetAllObjects();
var status = cursor.MoveToFirst();
while (status == DbStatus.OK)
{
var dbObject= Db.Create(cursor);
obs.OnNext(dbObject);
status = cursor.MoveToNext();
}
obs.OnCompleted();
return Disposable.Empty;
});
}
}
}
在我的视图类(特别是Loaded 事件)中,我订阅了数据源并使用缓冲区方法,希望保持 UI 响应。
public ObservableCollection<DbObject> DbObjects { get; set; }
private async void OnLoad(object sender, RoutedEventArgs e)
{
var observableData = CatalogService.Instance.DataSource.Publish();
var chunked = observableData.Buffer(TimeSpan.FromMilliseconds(100));
var dispatcherObs = chunked.ObserveOnDispatcher(DispatcherPriority.Background);
dispatcherObs.Subscribe(dbObjects =>
{
foreach (var dbObject in dbObjects)
{
DbObjects.Add(dbObject);
}
});
await Task.Run(() => observableData.Connect());
await dispatcherObs.ToTask();
}
不幸的是,结果恰恰相反。当我的视图控件(包含一个简单的ListBox 数据绑定到DbObjects 属性)加载时,它不会显示任何数据,直到整个目录被枚举。只有这样 UI 才会刷新。
我是 ReactiveUI 的新手,但我确信它能够胜任手头的任务。如果我使用不正确,有人有什么建议或指点吗?
【问题讨论】:
-
问题:您如何确定 UI 不仅仅是简单地呈现结果,速度如此之快以至于您看不到它们? UI真的没有响应吗?数据库查询中第一个结果的时间和最后一个结果的时间是多少?结果集中有多少行?
-
快速提问...这里的 IEnumerable
是什么对象? -
@Christopher:没有什么是 IEnumerable
。 DataSource 属性已从 IEnumerable 转换为 IObservable。 -
抱歉,请说 IEnumerable。
-
@James:UI 实际上并非没有响应,但 ListBox 一直是空的。大约有一千行(图像),ListBox 在很长一段时间后从 0 个图像变为所有图像。
标签: c# wpf system.reactive reactiveui