我只想异步检索数据,并在检索数据后,在UI(Winforms)中显示它。
使用.net 4.0,有两种方法可以实现这一点(我知道还有更多,但我使用的是这两种方式):
var task = Task.Factory.StartNew(() => RetrieveData());
task.ContinueWith(x => SetDataInUi(x.Result), TaskScheduler.FromCurrentSynchronizationContext());
OR
var obs = Observable.Start(() => RetrieveData());
obs.ObserveOn(SynchronizationContext.Current).Subscribe(x => SetDataInUi(x));
据我所知,这些都会做同样的事情。是否有理由选择其中一个?
答案 0 :(得分:5)
如果你只是想从某个地方请求数据并将其打印到屏幕上,我宁愿选择第一个解决方案。
第二个也可以工作,但RX旨在帮助您处理数据流。我们都同意,当你可以使用一个简单的解决方案时,使用复杂的解决方案并不酷:)
答案 1 :(得分:2)
简短的回答是否定的,这两种实现之间不应存在重大差异。
这些是不同的API,它们提供了描述类似操作的不同模型。
Task
API提供了一种避免直接使用线程的方法,而是处理您想要执行的各个任务。
Reactive
API提供了一种以有效方式在不同操作之间汇集数据的方法。
在这种情况下,你的问题在于两个领域。您正在处理一个不值得显式线程的小任务,并且您正在使用结果指导数据流。然而,前一个定义是一个更完整的描述符,因此它可能是您应该使用的解决方案。
您的现有代码是否使用任何一种解决方案?匹配您在其他地方所做的工作有助于提高可读性,并优先考虑这一点。
另请注意,有时在比较API时,您必须考虑依赖关系,而不是在这种情况下,但一般情况下请记住这一点。