Я новичок в Rx в .net, но начали использовать его с некоторым успехом подведению некоторых Коммуникационная сетьRX IObserver подписки времени
Очень упрощенный пример:
IObservable<Result> SendRequest(Request request)
{
return Observable.Create<Result>(observer =>
{
NetworkComms.SendReqeust(request,
result =>
{
observer.OnNext(result);
observer.OnCompleted();
});
return Disposable.Empty;
}).SubscribeOn(_commsScheduler);
}
Проблема у меня есть заключается в том, что команда (NetworkComms.SendRequest) фактически не отправляется до тех пор, пока вызывающий абонент не присоединится к возвращенному IObservable. В некоторых случаях запрос является командой «огонь-и-забыть», и результат довольно бессмыслен, поэтому для абонента не имеет смысла фактически подписываться на возвращаемый IObservable.
функциональность мне нужно:
- Команда отправляется немедленно, даже если абонент никогда не присоединяется к IObservable
- Если и когда клиент выписывает, они получат результат, даже если они поздняя подписка
- Команда отправляется только один раз, но все подписки должны получать одинаковые результаты.
Я попытался сделать это с использованием .Replay(). RefCount() и выполнить функцию Subscribe() перед возвратом IObservable. Это почти работает, но в том случае, когда клиент подписывает после результат, полученный (и, следовательно, после автоматического удаления последовательности после завершения), он вызывает повторный вызов кода подписки, отправляя команду во второй раз.
Есть ли простое расширение Rx, которое может справиться с этим сценарием для меня, или мне нужно катиться самостоятельно?
Это действительно странно, что сочинять это наблюдаемое. Вы говорите, что я буду запускать этот запрос время от времени до конца времени (или когда приложение закрывается) вернет мне результат, независимо от того, насколько он прост. – Enigmativity
Вы также не должны делать 'return Disposable.Empty;'. Если вы когда-либо делаете это, вы, вероятно, совершаете ошибку - вы обычно делаете блокирующую подписку (какая вы есть). Вам лучше вернуть подписку на «Observable.Start (() => {...}). Подписаться (observer)'. – Enigmativity