Observables vs Tasks - 首选实施?

时间:2012-02-09 18:05:28

标签: .net multithreading c#-4.0 system.reactive

我只想异步检索数据,并在检索数据后,在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));

据我所知,这些都会做同样的事情。是否有理由选择其中一个?

2 个答案:

答案 0 :(得分:5)

如果你只是想从某个地方请求数据并将其打印到屏幕上,我宁愿选择第一个解决方案。

第二个也可以工作,但RX旨在帮助您处理数据流。我们都同意,当你可以使用一个简单的解决方案时,使用复杂的解决方案并不酷:)

答案 1 :(得分:2)

简短的回答是否定的,这两种实现之间不应存在重大差异。

这些是不同的API,它们提供了描述类似操作的不同模型。

Task API提供了一种避免直接使用线程的方法,而是处理您想要执行的各个任务。

Reactive API提供了一种以有效方式在不同操作之间汇集数据的方法。

在这种情况下,你的问题在于两个领域。您正在处理一个不值得显式线程的小任务,并且您正在使用结果指导数据流。然而,前一个定义是一个更完整的描述符,因此它可能是您应该使用的解决方案。

您的现有代码是否使用任何一种解决方案?匹配您在其他地方所做的工作有助于提高可读性,并优先考虑这一点。

另请注意,有时在比较API时,您必须考虑依赖关系,而不是在这种情况下,但一般情况下请记住这一点。