OK,这似乎是智力问题,所以:
从C#编译器的角度来看,为的IObservable方法签名(S),你提出这将是(考虑到T =除外):
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext);
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onError);
两种重载方法都有相同的签名,编译器不支持。
从接口的角度来看,你已经IObserver定义是这样的:
public interface IObserver<in T>
{
void OnCompleted();
void OnError(Exception error);
void OnNext(T value);
}
实施者的接口必须是这样的:
public class Observer<T> : IObserver<T>
{
public void OnCompleted()
{
}
public void OnError(Exception error)
{
// Do something with exception
}
public void OnNext(T value)
{
}
}
所以,即使你不指定OnNext = ()=> {},底层基础架构必须实现它。你不会失去指定它的任何性能。
从观察者模式的逻辑角度来看,你的意图是异步地订阅元素/事件序列。忽略OnNext函数并只保留OnError的方法签名会对Rx库的用户造成误导。更明确的是,如果您明确表明您的意图是不想在OnNext上做任何事情。
一旦OnCompleted或onError方法已被接收时,Rx 语法保证订阅可以被认为是 完成。
你正在试图做的将相当于使空foreach循环,等待例外的是什么:
try
{
foreach (var e in sequence)
{
// do nothing
}
}
catch (Exception ex)
{
// Do something
}
这是不常见的场景。
根据你的相关问题,这听起来像你想观察一系列的例外,但OnError保证只给你一个......正如Nenad所说的。另外你已经接近...你需要IObservable或主题,并使用OnNext,而不是OnError。当您的IObservable 发生异常时,OnError会失效,而不是流本身。希望有所帮助。 –
2013-02-16 12:20:18