Threading.Tasks在.NET 3.5中的Rx扩展模拟?

时间:2011-07-31 19:32:59

标签: c# .net-3.5 system.reactive

是否可以使用Reactive Extensions(Rx)在.NET 3.5中创建执行并行化的应用程序,还是以某种方式限制?我从这里http://www.microsoft.com/download/en/confirmation.aspx?id=26649下载了Rx,在创建了一个带引用的反应式程序集的简单项目之后,我找不到与.NET 4.0中的Tasks相对应的任何类。我正在尝试为“任务”找到课程,但唉,我找不到任何课程。我做错了吗?

6 个答案:

答案 0 :(得分:5)

正如这里提到的那样,您可以在旧的System.Threading.dll安装中找到反向移植的Rx

为了更容易整合,我已经制作了一个nuget(称为 TaskParallelLibrary )。

您可以从http://nuget.org/packages/TaskParallelLibrary获取。

答案 1 :(得分:4)

据我所知,包含“the back ported standalone DLL named System.Threading.dll”的最新版本的Reactive Extensions已于2011年2月11日发布Reactive Extensions (Rx) v1.0.2856.0(在Rx_Net35.msi中)。

(我实际上已经将它作为Rx_Net35.v1.0.2856.0.msi,在5月份下载,我想从CodePlex获取;再也找不到了......它在我的64上安装为C:\Program Files (x86)\Microsoft Cloud Programmability\Reactive Extensions\v1.0.2856.0\Net35\System.Threading.dll比特系统。)

答案 2 :(得分:3)

System.Threading,TPL的程序集曾经包含在Rx版本中,但不再是。

您可以在旧版本中找到它。

也就是说,IObservable<T>类似于Task<T>,其关键区别是Task<T>只能有1个结果,IObservable<T>是0的流或者更多结果。

答案 3 :(得分:1)

也许samples from the rx wiki可以帮到你。

最简单的后台任务是:

var o = Observable.Start
(
    () => 
    { 
        Console.WriteLine("Calculating..."); 
        Thread.Sleep(3000); 
        Console.WriteLine("Done."); 
    }
);

o.First();   // subscribe and wait for completion of background operation

但您可能还想查看forkjoin示例。

答案 4 :(得分:1)

.NET 3.5中的Rx不能使用任务,它使用.NET 3.5线程池 - 但是,正如Scott所说,当IObservable是一个项目时,IObservable就像Task一样。

答案 5 :(得分:1)

如果我错了,请纠正我。

观察者和观察者主要与任务有关 - 观察(等待数据)&amp;订阅(观察者获取被推送的数据)。

Observable提供了两个运算符来提高上述两项任务的性能。

1)。 Observable.ObserveOn - 在指定的调度表上异步通知观察者。 可以使用Schedular以更好的方式执行任务,其中它接受

的参数
  • Scheduler.CurrentThread(观察当前正在运行的线程)
  • Scheduler.NewThread(每次在新主题上观察)
  • Scheduler.TaskPool(观察使用TaskPool机制,我想你可能会感兴趣。)
  • Scheduler.ThreadPool(使用ThreadPool机制观察)

同样适用于第二个......

2)。 Observable.SubscribeOn - 异步订阅 - 取消订阅指定调度程序上的观察者。

它也有与上述相同的选项来安排订阅。

因此,Rx提供内置功能来安排您的流程以提供快速结果。