C# 忽略Observable中的异常并继续

C# 忽略Observable中的异常并继续,c#,udp,system.reactive,C#,Udp,System.reactive,考虑到这一点: _listener = Observable.Defer(() => _deviceTypeProvider.GetDeviceTypes().ToObservable() .SelectMany(CreateUdpListener, CreateMessage) .OfType<DeviceMessage>() .SelectMany(InjectTestMode)

考虑到这一点:

_listener = Observable.Defer(() => _deviceTypeProvider.GetDeviceTypes().ToObservable()
            .SelectMany(CreateUdpListener, CreateMessage)
            .OfType<DeviceMessage>()
            .SelectMany(InjectTestMode)
            .OfType<DeviceMessage>()
            .Do(async message => await PublishMessage(message)))
            .Retry()
            .Subscribe(OnMessageReceive, OnError, OnComplete);

IObservable
的文档指定序列必须匹配此语法:

OnNext* (OnCompleted|OnError)
异常或完成后不能再发出任何值。如果您手动创建一个违反此语法的可观察对象,则在使用任何现有Rx操作符时,您可能会出现未定义的行为。不好


如果希望获得重试行为,则将查询建模为
IEnumerable
IObservable
,其中外部
IEnumerable
IObservable
从不抛出。

IObservable
的文档指定序列必须匹配此语法:

OnNext* (OnCompleted|OnError)
异常或完成后不能再发出任何值。如果您手动创建一个违反此语法的可观察对象,则在使用任何现有Rx操作符时,您可能会出现未定义的行为。不好



如果希望获得重试行为,则将查询建模为
IEnumerable
IObservable
,其中外部的
IEnumerable
IObservable
从不抛出在这个函数中。

制作一些静态扩展函数,将委托传递给它,并将其包装成这个函数中的try{}catch{}。

谢谢我去做一些研究,有没有机会给我简单的代码片段来说明这个概念?我找不到这个概念的任何示例,但我会继续查找。现在,我的代码打开和关闭UDP端口(根据重试和延迟),这不是很好,但比以前更好。@johnkatenhorn如果您有一个冷可观察对象(意味着它只在您订阅后执行任何操作),但希望使其成为热可观察对象(意味着无论是否有订阅者,它都会产生值)然后,您可以使用
Publish
方法来实现这一点。这将为您提供一个
IConnectableObservable
,您可以在其上调用
Connect
。听起来这正是你现在想要的。是的,我现在有一个感冒,看起来很适合我们的需要。在忽略异常方面,移动到热可观测对象是否给了我更多的灵活性?考虑到我们已经断断续续地研究这段代码好几个月了,它正在变得更好,但仍然存在问题,我不想尝试重构成一个热门的可观察对象,除非有令人信服的理由。也许从这里开始,或者在introx.com*上花大约4-8小时阅读可以节省10倍于犯基本错误(比如误解协议)的时间*披露,我是作者。谢谢我会去做一些研究,有没有机会给我简单的代码片段来说明这个概念?我找不到这个概念的任何例子,但我会继续寻找。现在,我的代码打开和关闭UDP端口(根据重试和延迟),这不是很好,但比以前更好。@johnkatenhorn如果您有一个冷可观察对象(意味着它只在您订阅后执行任何操作),但希望使其成为热可观察对象(意味着无论是否有订阅者,它都会产生值)然后,您可以使用
Publish
方法来实现这一点。这将为您提供一个
IConnectableObservable
,您可以在其上调用
Connect
。听起来这正是你现在想要的。是的,我现在有一个感冒,看起来很适合我们的需要。在忽略异常方面,移动到热可观测对象是否给了我更多的灵活性?考虑到我们已经断断续续地研究这段代码好几个月了,它正在变得更好,但仍然存在问题,我不想尝试重构成一个热门的可观察对象,除非有令人信服的理由。也许从这里开始,或者在introx.com*上花大约4-8小时阅读可以节省10倍于犯基本错误(比如误解协议)的时间*披露,我是作者。我会避免那种鬼鬼祟祟的
Do
方法。看起来这个逻辑属于您的
OnMessageReceive
方法我完全同意,但是我发现我的订阅中不应该有异步方法调用,因为async void。事实上,订阅中只剩下一条日志消息,这让人感觉不对!我明白你的推理,所以你要做的是创建一个延续。类似于
。选择many(message=>PublishMessage(message).ToObservable())
。是的,如果订阅中的OnNext处理程序什么都不做,则通常是一种代码气味。Rx是关于使用异步/可观察序列的,所以您应该观察它们!;-)明白了,是的,太棒了!当Publish on返回一个任务时,我看到订阅发出了一个单位,这还可以吗?我会避免那种鬼鬼祟祟的
Do
方法。看起来这个逻辑属于您的
OnMessageReceive
方法我完全同意,但是我发现我的订阅中不应该有异步方法调用,因为async void。事实上,订阅中只剩下一条日志消息,这让人感觉不对!我明白你的推理,所以你要做的是创建一个延续。类似于
。选择many(message=>PublishMessage(message).ToObservable())
。是的,如果订阅中的OnNext处理程序什么都不做,则通常是一种代码气味。Rx是关于使用异步/可观察序列的,所以您应该观察它们!;-)明白了,是的,太棒了!当Publish on返回一个任务时,我看到订阅发出一个单位,这还可以吗?