<PackageReference Include="System.Reactive" Version="6.0.0-preview.13" />

TaskObservableMethodBuilder<T>

public struct TaskObservableMethodBuilder<T>
Represents a builder for asynchronous methods that return a task-like ITaskObservable<T>.
using System.Reactive; using System.Reactive.Concurrency; using System.Reactive.Disposables; using System.Reactive.Subjects; using System.Security; namespace System.Runtime.CompilerServices { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public struct TaskObservableMethodBuilder<[System.Runtime.CompilerServices.Nullable(2)] T> { [System.Runtime.CompilerServices.Nullable(0)] internal sealed class TaskObservable : ITaskObservable<T>, IObservable<T>, ITaskObservableAwaiter<T>, INotifyCompletion { [System.Runtime.CompilerServices.Nullable(new byte[] { 2, 1 })] private readonly AsyncSubject<T> _subject; [System.Runtime.CompilerServices.Nullable(2)] private readonly T _result; [System.Runtime.CompilerServices.Nullable(2)] private readonly Exception _exception; public bool IsCompleted { get { AsyncSubject<T> subject = _subject; if (subject == null) return true; return subject.IsCompleted; } } public TaskObservable() { _subject = new AsyncSubject<T>(); } public TaskObservable(T result) { _result = result; } public TaskObservable(Exception exception) { _exception = exception; } public void SetResult(T result) { if (IsCompleted) throw new InvalidOperationException(); _subject.OnNext(result); _subject.OnCompleted(); } public void SetException(Exception exception) { if (IsCompleted) throw new InvalidOperationException(); _subject.OnError(exception); } public IDisposable Subscribe(IObserver<T> observer) { if (_subject != null) return _subject.Subscribe(observer); if (_exception != null) { observer.OnError(_exception); return Disposable.Empty; } observer.OnNext(_result); return Disposable.Empty; } public ITaskObservableAwaiter<T> GetAwaiter() { return this; } public T GetResult() { if (_subject != null) return _subject.GetResult(); Exception exception = _exception; if (exception != null) exception.Throw(); return _result; } public void OnCompleted(Action continuation) { if (_subject != null) _subject.OnCompleted(continuation); else continuation(); } } private IAsyncStateMachine _stateMachine; [System.Runtime.CompilerServices.Nullable(new byte[] { 1, 0 })] private TaskObservable _inner; public ITaskObservable<T> Task => _inner ?? (_inner = new TaskObservable()); [return: System.Runtime.CompilerServices.Nullable(new byte[] { 0, 1 })] public static TaskObservableMethodBuilder<T> Create() { return default(TaskObservableMethodBuilder<T>); } public void Start<[System.Runtime.CompilerServices.Nullable(0)] TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { if (stateMachine == null) throw new ArgumentNullException("stateMachine"); stateMachine.MoveNext(); } public void SetStateMachine(IAsyncStateMachine stateMachine) { if (_stateMachine != null) throw new InvalidOperationException(); if (stateMachine == null) throw new ArgumentNullException("stateMachine"); _stateMachine = stateMachine; } public void SetResult(T result) { if (_inner == null) _inner = new TaskObservable(result); else _inner.SetResult(result); } public void SetException(Exception exception) { if (exception == null) throw new ArgumentNullException("exception"); if (_inner == null) _inner = new TaskObservable(exception); else _inner.SetException(exception); } public void AwaitOnCompleted<[System.Runtime.CompilerServices.Nullable(0)] TAwaiter, [System.Runtime.CompilerServices.Nullable(0)] TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { try { if (this._stateMachine == null) { ITaskObservable<T> task = this.Task; this._stateMachine = (IAsyncStateMachine)(object)stateMachine; this._stateMachine.SetStateMachine(this._stateMachine); } ref TAwaiter reference = ref awaiter; TAwaiter val = default(TAwaiter); if (val == null) { val = reference; ref reference = ref val; } IAsyncStateMachine stateMachine2 = this._stateMachine; reference.OnCompleted(stateMachine2.MoveNext); } catch (Exception exception) { TaskObservableMethodBuilder<T>.Rethrow(exception); } } [SecuritySafeCritical] public void AwaitUnsafeOnCompleted<[System.Runtime.CompilerServices.Nullable(0)] TAwaiter, [System.Runtime.CompilerServices.Nullable(0)] TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { try { if (this._stateMachine == null) { ITaskObservable<T> task = this.Task; this._stateMachine = (IAsyncStateMachine)(object)stateMachine; this._stateMachine.SetStateMachine(this._stateMachine); } ref TAwaiter reference = ref awaiter; TAwaiter val = default(TAwaiter); if (val == null) { val = reference; ref reference = ref val; } IAsyncStateMachine stateMachine2 = this._stateMachine; reference.UnsafeOnCompleted(stateMachine2.MoveNext); } catch (Exception exception) { TaskObservableMethodBuilder<T>.Rethrow(exception); } } private static void Rethrow(Exception exception) { Scheduler.Schedule<Exception>((IScheduler)Scheduler.Default, exception, (Action<Exception, Action<Exception>>)delegate(Exception ex, Action<Exception> recurse) { ex.Throw(); }); } } }