我刚刚注意到await
关键字可以与Rx Observable一起使用,例如:
await Observable.Interval(TimeSpan.FromHours(1));
我很确定它只能与任务一起使用。
那么是什么让它成为可能呢?观察者模式的知识是硬编码到编译器中的吗?
我刚刚注意到await
关键字可以与Rx Observable一起使用,例如:
await Observable.Interval(TimeSpan.FromHours(1));
我很确定它只能与任务一起使用。
那么是什么让它成为可能呢?观察者模式的知识是硬编码到编译器中的吗?
我认为这是因为System.Reactive.Linq
在IObservable
上定义了一个GetAwaiter
扩展方法。正如@mike z所解释的那样,这允许您等待IObservable
。以下是该方法:
public static AsyncSubject<TSource> GetAwaiter<TSource>(this IObservable<TSource> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return s_impl.GetAwaiter<TSource>(source);
}
返回类型 AsyncSubject<T>
实现了 INotifyCompletion
接口,并且具有属性 IsCompleted
和方法 GetResult
。
public sealed class AsyncSubject<T> : ISubject<T>, ISubject<T, T>, IObserver<T>, IObservable<T>, IDisposable, INotifyCompletion
{
// Fields
private Exception _exception;
private readonly object _gate;
private bool _hasValue;
private bool _isDisposed;
private bool _isStopped;
private ImmutableList<IObserver<T>> _observers;
private T _value;
// Methods
public AsyncSubject();
private void CheckDisposed();
public void Dispose();
public AsyncSubject<T> GetAwaiter();
public T GetResult();
public void OnCompleted();
public void OnCompleted(Action continuation);
private void OnCompleted(Action continuation, bool originalContext);
public void OnError(Exception error);
public void OnNext(T value);
public IDisposable Subscribe(IObserver<T> observer);
// Properties
public bool HasObservers { get; }
public bool IsCompleted { get; }
OnCompleted
时,等待可观察对象仅返回最后一个值。如果序列中没有任何值,则会抛出异常。 - Dave Sexton