C# Rx:将简单的同步调用封装在冷可观察对象中

C# Rx:将简单的同步调用封装在冷可观察对象中,c#,observable,system.reactive,C#,Observable,System.reactive,我经常发现自己必须将简单的同步调用或函数转换为可观察到的兼容调用或函数,这样我就可以更容易地组合可观察到的流 例如,我的最后一个: public IObservable<Unit> UnlinkFile(FileRef fileRef) { try { File.Delete(fileRef.Path); return Observable.Return(Unit.Default); } catch (Exception ex) {

我经常发现自己必须将简单的同步调用或函数转换为可观察到的兼容调用或函数,这样我就可以更容易地组合可观察到的流

例如,我的最后一个:

public IObservable<Unit> UnlinkFile(FileRef fileRef) {
    try {
        File.Delete(fileRef.Path);

        return Observable.Return(Unit.Default);
    } catch (Exception ex) {
        return Observable.Throw<Unit>(ex);
    }
}
我可以使用
.Do
,但是
.Do
的问题是它不会将经典的SEH异常抛出到它所属的可观察对象中

有没有更好的模式来实现这一点?我们的选择是什么?我应该更好地使用
Observable.Start()
Observable.Create()
或其他方法来获得一个冷的Observable吗


有没有其他语法可以避免上面的样板文件?

我会使用
Observable.Start(()=>File.Delete(fileRef.Path))


您只需确保每次有一个订阅服务器访问observable。

我将使用
observable.Start(()=>File.Delete(fileRef.Path))


您只需确保一次有一个用户访问可观察数据流。

“有更好的模式实现这一点吗?”是的,首先不要将副作用注入可观察数据流。类似于
取消链接文件
的内容属于
订阅
,而不属于
选择
。如果你真的必须使用这种反模式,那么我猜你在寻找
可观察的。创建
。我会使用
可观察的。开始(()=>File.Delete(fileRef.Path))
@lucastzesniewski:在正常情况下,我会同意,但有时这看起来不可能或不可取。在我的例子中,这个类了解“文件系统”的内容,并提供可能修改或不修改其状态的可观察对象。提供,而不是订阅。此类的使用者对该文件系统不感兴趣,因此他们不能在订阅中调用文件系统的副作用(事实上,我甚至没有订阅,这是由UI代码自动处理的)。第二个异议:在副作用之后,我还有其他事情要做。我可以把它们放在哪里?至少这个可观察的流描述了在一个地方发生的事情和做的事情,并且没有违反责任原则。我同意SelectMany在其名称中没有预期会产生副作用的语义,但我不知道我是否真的能做得更好。@Enigmativity它是我的方法的1:1等价物,它冷吗?如果是,你介意发布一个答案,这样我就可以接受,而不是对评论进行投票吗?:)“有没有更好的模式来实现这一点?”是的,首先不要将副作用注入可观察的流中。类似于
取消链接文件
的内容属于
订阅
,而不属于
选择
。如果你真的必须使用这种反模式,那么我猜你在寻找
可观察的。创建
。我会使用
可观察的。开始(()=>File.Delete(fileRef.Path))
@lucastzesniewski:在正常情况下,我会同意,但有时这看起来不可能或不可取。在我的例子中,这个类了解“文件系统”的内容,并提供可能修改或不修改其状态的可观察对象。提供,而不是订阅。此类的使用者对该文件系统不感兴趣,因此他们不能在订阅中调用文件系统的副作用(事实上,我甚至没有订阅,这是由UI代码自动处理的)。第二个异议:在副作用之后,我还有其他事情要做。我可以把它们放在哪里?至少这个可观察的流描述了在一个地方发生的事情和做的事情,并且没有违反责任原则。我同意SelectMany在其名称中没有预期会产生副作用的语义,但我不知道我是否真的能做得更好。@Enigmativity它是我的方法的1:1等价物,它冷吗?如果是,你介意发布一个答案,这样我就可以接受,而不是对评论进行投票吗?:)
.SelectMany(_ => filesystem.UnlinkFile(fileRef))