Reactive Extensions带有许多辅助方法,用于将现有事件和异步操作转换为可观察对象,但是如何从头开始实现IObservable <T>?
IEnumerable有一个可爱的yield关键字,使其实现起来非常简单.
实现IObservable <T>的正确方法是什么?
我需要担心线程安全吗?
我知道有人支持在特定的同步上下文中回调,但这是否是我作为IObservable <T>作者需要担心或者以某种方式内置的内容?
更新:
这是Brian的F#解决方案的C#版本
using System;
using System.Linq;
using Microsoft.FSharp.Collections;
namespace Jesperll
{
class Observable<T> : IObservable<T>, IDisposable where T : EventArgs
{
private FSharpMap<int, IObserver<T>> subscribers =
FSharpMap<int, IObserver<T>>.Empty;
private readonly object thisLock = new object();
private int key;
private bool isDisposed;
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing && !isDisposed)
{
OnCompleted();
isDisposed = true;
}
}
protected void OnNext(T value)
{
if (isDisposed) …Run Code Online (Sandbox Code Playgroud) 我在另一个主题中对这个主题进行了一次小型讨论,并希望人们对主题的"坏"方面提出意见.
频繁参与RX论坛的人都知道E.Meijer不喜欢受试者.虽然我对RX创作者的观点有最深刻的敬意,但我已经在多个项目中广泛使用了Subjects几年,并且因为它们没有任何架构问题或错误.
我可以命名的主题的唯一"陷阱"是它们不是"可重用的" - 在完成主题上的可观察对象之后,您需要在新订阅者可以从其接收事件之前重新实例化它.
"代码味道"和"不喜欢它们"需要"实用"示例支持 - 您是否可以引起我们注意使用主题可能导致错误或问题的可能情况?或许你认为它们完全是容易和无害的 - 然后尝试定义它们将被使用的区域.