Мне нужно как-то предотвратить InvalidOperationException
, который выбрасывается при вызове ToTask в Observable, который не производит никаких значений.
Что я видел, так это то, что метод ToTask создает экземпляр ToTaskObserver
и хочет, чтобы по крайней мере одно значение не выдало исключение:
private sealed class ToTaskObserver<TResult> : SafeObserver<TResult>
{
//[...]
private bool _hasValue;
private TResult _lastValue;
public ToTaskObserver(TaskCompletionSource<TResult> tcs, CancellationToken ct)
{
//[...]
}
public override void OnNext(TResult value)
{
_hasValue = true;
_lastValue = value;
}
//[...]
public override void OnCompleted()
{
if (_hasValue)
{
_tcs.TrySetResult(_lastValue);
}
else
{
_tcs.TrySetException(new InvalidOperationException(Strings_Linq.NO_ELEMENTS));
}
//[...]
}
//[...]
}
Единственное решение, которое я нашел, это имитировать метод расширения и вставлять фиктивную запись в Observable путем слияния:
public static Task<Record<TKey, TValue>> ToTask<TKey, TValue>(
this IObservable<Record<TKey, TValue>> source, CancellationToken token)
{
var pseudoObservable = new[] {Record.Create<TKey, TValue>(default, default)}.ToObservable();
return source.Merge(pseudoObservable).ToTask(token);
}
Этот вопрос особенно касается метода ToTask
. Я знаю, что когда я буду использовать метод Subscribe
, у меня не будет этой проблемы.
У кого-нибудь есть лучшее решение для этого? У меня есть сценарии, в которых моя наблюдаемая не будет иметь никаких записей.