c# - react 性可观察订阅处置

标签 c# .net system.reactive

如果我可以访问一个我知道只会返回一个项目的 IObservable,这会起作用吗?这是最好的使用模式吗?

IDisposable disposable = null;
disposable = myObservable.Subscribe(x =>
  {
     DoThingWithItem(x);
     if (disposable != null)
     {
       disposable.Dispose();
     }
  });

最佳答案

Subscribe 扩展方法返回的可释放对象仅允许您在可观察对象自然结束之前手动取消订阅可观察对象。

如果 observable 完成 - 使用 OnCompletedOnError - 那么订阅已经为你处理了。

试试这段代码:

var xs = Observable.Create<int>(o =>
{
    var d = Observable.Return(1).Subscribe(o);
    return Disposable.Create(() =>
    {
        Console.WriteLine("Disposed!");
        d.Dispose();
    });
});

var subscription = xs.Subscribe(x => Console.WriteLine(x));

如果你运行上面的代码,你会看到“Disposed!”当 Observable 完成时写入控制台,而无需在订阅上调用 .Dispose()

需要注意的一件重要事情:垃圾收集器从不对可观察订阅调用 .Dispose(),因此您必须处理您的订阅,如果它们没有(或可能)没有)在您的订阅超出范围之前自然结束。

以这个为例:

var wc = new WebClient();

var ds = Observable
    .FromEventPattern<
        DownloadStringCompletedEventHandler,
        DownloadStringCompletedEventArgs>(
            h => wc.DownloadStringCompleted += h,
            h => wc.DownloadStringCompleted -= h);

var subscription =
    ds.Subscribe(d =>
        Console.WriteLine(d.EventArgs.Result));

ds observable 只会在有订阅时附加到事件处理程序,并且只会在 observable 完成或订阅被销毁时分离。由于它是一个事件处理程序,因此 observable 永远不会完成,因为它正在等待更多事件,因此处理是从事件中分离的唯一方法(对于上面的示例)。

当你有一个你知道只会返回一个值的 FromEventPattern observable 时,明智的做法是在订阅之前添加 .Take(1) 扩展方法以允许事件处理程序自动分离,然后您无需手动处理订阅。

像这样:

var ds = Observable
    .FromEventPattern<
        DownloadStringCompletedEventHandler,
        DownloadStringCompletedEventArgs>(
            h => wc.DownloadStringCompleted += h,
            h => wc.DownloadStringCompleted -= h)
    .Take(1);

希望对您有所帮助。

关于c# - react 性可观察订阅处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7703366/

相关文章:

c# - 相当于Javascript的encodeURI?

c# - 如何使用 Rx 监控文件的变化?

c# - 管理 Access 数据库的路径

c# - 无法将文件从 obj\Debug 复制到 bin\Debug

c# - 无法使用 CSS 选择器定位链接

c# - 拆分 IObservable<byte[]> 到字符然后到行

c# - 如何设置 Observable 来监视属性?

c# - EF Core 在迁移 (UP) 时将列数据从表移动到另一个表

c# - 如何在安装程序期间使用 SetupCopyOEMInf

c# - .Net Excel 添加帮助