Reactive Extensions for .NET (Rx)
LINQ to Object使用IEnumerable和IEnumerator兩個接口來迭代數(shù)據(jù)集。枚舉器的MoveNext()方法用于從前一個元素枚舉到下一個元素,而Current屬性則用于檢索個別的元素。這種機制采取廣泛使用的簡潔易懂的"拉(pull)"過程。與之還有一種對應的"推"模式:一個是可以從集合中提取數(shù)據(jù),同時可以把數(shù)據(jù)推進同樣的集合。
理論上來說,IEnumerable接口可對集合添加對象,但是由于它的阻塞性所以不能在異步操作中進行。.Net 4.0中引入了兩個新的接口:IObservable和IObserver。人們可以把IObserver賦給數(shù)據(jù)集并把它作為IObservable訂閱。當一項新的數(shù)據(jù)可用時,就可以通過傳遞IObservable來把它壓進集合,接著再傳給Iobserver。如下是一個簡單的示例:
????class Program
????{
????????public static void Main()
????????{
????????????new NumbersObservable(new[] { 2, 3, 4 }).Subscribe(new DebugObserver());
????????}
????}
????internal class AnonymousDisposable : IDisposable
????{
????????internal Action Action { get; set; }
????????void IDisposable.Dispose()
????????{
????????????this.Action();
????????}
????}
????class NumbersObservable : IObservable<int>
????{
????????public NumbersObservable(IEnumerable<int> numbers)
????????{
????????????this._numbers = numbers;
????????}
????????private IEnumerable<int> _numbers;
????????public IDisposable Subscribe(IObserver<int> observer)
????????{
????????????foreach (int number in _numbers)
????????????{
????????????????observer.OnNext(number);
????????????}
????????????observer.OnCompleted();
????????????return new AnonymousDisposable { Action = () => { ; } };
????????}
????}
????class DebugObserver : IObserver<int>
????{
????????public void OnNext(int value) { Console.WriteLine("{0}", value); }
????????public void OnCompleted() { Console.WriteLine("all done."); }
????????public void OnError(Exception ex) { Console.WriteLine("Whoops exception, I'd better throw."); throw ex; }
????}
這種方法在處理事件的時候有著極大的優(yōu)勢。我們可以把IObserver附加到鼠標事件并對這些事件異步記錄到一個集合當中。接著就可以使用LINQ來迭代數(shù)據(jù),并進行相應的處理。要說明它在處理GUI事件的威力。上面只是一個簡單的示例,Reactive Extensions實現(xiàn)了更多更為強大的功能,.net 3.5和.net 4.0 (最終會作為.net 4.0的一部分隨VisualStudio2010一起發(fā)布)的Beta版可以在DevLabs: Reactive Extensions for .NET (Rx)下載。
另外,關(guān)于Reactive Extensions的示例,可以參看以下這個網(wǎng)頁:
.NET 的 Reactive Extension (Rx)
關(guān)于觀察者模式的介紹,可以參看這兩篇文章:
Observer(觀察器)
探究觀察者設(shè)計模式
總結(jié)
以上是生活随笔為你收集整理的Reactive Extensions for .NET (Rx)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#取真实IP地址--多个代理背后的ip
- 下一篇: 思科防火墙nat-control的作用