Reactive Extensions 6/5/2011 release available


We’re pleased to announce the availability of the 6/5/2011 releases of the Reactive Extensions (Rx) for .NET.

Release Notes:

  • Changed Windows Phone 7 version to no longer rely on features which are not available on that platform.
  • Added CLSCompliant assembly attribute.
  • Added AllowPartiallyTrustedCallers assembly attribute.
  • Changed AsyncLock to use rethrow when exceptions occur.
  • Replaced MutableDisposable and policy object by three types: SingleAssignmentDisposable (was SingleAssignment), MultipleAssignmentDisposable (was Replace), and SerialDisposable (was ReplaceAndDispose).
  • Changed NewThreadScheduler to use a dedicated event loop for recursive scheduling.
  • Removed unnecessary ForEach overloads. Use try-catch or statement composition to add code for OnCompleted or OnError, or leverage Do to perform side-effects.
  • Changed Observable.Interval to not try to pump missed intervals.
  • Added redist.txt file describing redistributable files.
  • Stable Release available for .NET Framework 3.5, .NET Framework 4, Silverlight 4, and Windows Phone 7. NuGet packages available with prefix Rx-.
  • Experimental Release available for .NET Framework 3.5, .NET Framework 4, Silverlight 4, Silverlight 5, and Windows Phone 7. NuGet packages available with prefix Rx_Experimental.

Give it a try and let us know what you think!


Comments (7)

  1. tivadj says:

    I wonder how do you guys envision place of Rx among c# v.next feature set, TPL and TPLDataflow.

  2. Rx team says:

    Hi tijadv,

    Very good question. The short answer is that the technologies complement each other very well. While there is some overlap, the technologies largely serve distinct needs. Let's dive a little deeper and point out two core differences.

    First of all, the abstraction in Rx – IObservable<T> – represents a stream of events, while the abstraction in TPL – Task<T> – represents a single-value computation (a.k.a. a "future"). The latter can easily be represented by the former, but not vice versa. This said, there are conversions between the domains. For example, you can turn a Task<T> into an IObservable<T>, therefore giving access to all of the advanced Rx operators. The opposite direction exists too, giving rise to a "selection problem": which value of the sequence gets surfaces by the resulting task? The answer is the last.

    Second, the language support for asynchronous computation and coordination provided by C# and VB vNext in the form of async/await provides for an imperative coding approach as most people are used to. Task<T> is a natural fit for that, representing a single-value asynchronous computation. Just like the language has always had synchronous singe-value computation through expressions, async/await simply complements this. Rx, on the other hand, piggybacks on LINQ to deal with sequences. Similar to using LINQ for enumerable sequences, this is a great fit for the problem at hand (i.e. event stream processing). Again, there's a better together story here: the experimental release of Rx includes support for await, so you can await an observable sequence, producing the last value of the sequence (just like the Task<T> conversion mentioned earlier).

    You can also watch my "Demystifying the .NET Asynchronous Programming Landscape" talk (available at channel9.msdn.com/…/Devdays081), which includes a discussion of this very topic near the end.

    Hope this helps and thanks for your interest,

    -Bart

  3. JT says:

    Changed AsyncLock to use rethrow when exceptions occur.

    This small change will be a god send to us, thank you.

  4. tivadj says:

    >>You can also watch my "Demystifying the .NET Asynchronous Programming Landscape" talk

    Thanks Bart, I watched this presentation. Very nice. But I still can't get the whole picture.

    In CCR there were ports, which similar to IObservable can handle streams of messages/events. And I could easily compose these streams into eg. multiple readers-exclusive writer Arbiter. It seems that Rx should have similar/alternative solution too. I am going to check it out… But TPLDataflow reincarnated this reader-writer concept into exclusive schedulers. Many overlapping ideas which multiply a "pain of choice".

    Not an appropriate place to ask, but what Microsoft is planning for CCR and which library Rx/TplDataflow will be integrated into .NET Framework?

  5. Andy Sherwood says:

    What happened to System.Interactive?? I've been relying on EmumerableEx to provide a lot of missing LINQ operations for quite awhile now. Has it been separated from System.Reactive? Deprecated?

    There's no mention of it going away in the release notes, which surprises me given it's such a large change.

  6. Takayoshi Tanaka says:

    Rx_Experimental-Silverlight depends on Rx-Main(1.1.10605), but Rx-Main is downgrades to 1.0.10605 instead Rx_Experimental-Main is released.

    I wonder Rx_Experimental-Silverlight should  depend on Rx_Experimental-Main.

  7. Leonid Shirmanov says:

    Blog post about Observable.Generate and Observable.Interval

    http://www.shirmanov.com/…/rx-framework-observablegenerate-and.html