反应性可观察订阅处置

2024-01-08

如果我有权访问一个我知道只会返回一项的 IObservable,这是否有效?它是最佳使用模式吗?

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

退回的一次性用品Subscribe返回扩展方法只是为了允许您手动取消订阅可观察的before可观察的自然结束。

如果可观察完成 - 使用任一OnCompleted or OnError- 那么订阅已经为您处理完毕。

试试这个代码:

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));

如果您运行上面的命令,您将看到“已处理!”当可观察完成时写入控制台,无需调用.Dispose()关于订阅。

需要注意的一件重要事情:垃圾收集器从不调用.Dispose()在可观察的订阅上,所以你must如果您的订阅在您的订阅超出范围之前尚未(或可能尚未)自然结束,请处置您的订阅。

以此为例:

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));

The dsobservable 仅在具有订阅时才会附加到事件处理程序,并且仅在 observable 完成或订阅被释放时才会分离。由于它是一个事件处理程序,可观察对象永远不会完成,因为它正在等待更多事件,因此处置是与事件分离的唯一方法(对于上面的示例)。

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

Like so:

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

我希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反应性可观察订阅处置 的相关文章

  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • 更改实体的可访问性

    我想建立一个内部实体 我已将实体 其标量属性和导航属性更改为内部 当我尝试构建它时出现此错误 错误 6036 EntityType 文件 具有 内部 可访问性 EntitySet 文件 具有具有 公共 可访问性的 get 属性 Entity
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 我如何知道向量的实际最大大小? (不使用 std::vector::max_size)

    在在线课程中 我正在学习向量 在其中一个例子中 他们解释说 std vector max size 应该给我向量可以达到的最大大小 我决定测试一下 include
  • 为什么我收到编译错误“使用已删除的函数 'std::unique_ptr ...”

    我收到一条巨大的编译错误消息 c mingw include c 6 1 0 bits predefined ops h 123 18 error use of deleted function std unique ptr lt Tp D
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 编译器消息“警告:格式‘%s’需要类型‘char *’,但参数 2 具有类型‘char (*)’”

    我正在尝试运行一个简单的 C 程序 但收到此错误 警告 格式 s 需要类型 char 但参数 2 的类型为 char 20 我在跑步Mac OS X v10 8 https en wikipedia org wiki OS X Mounta
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • 如何在 C 语言中获取输入中的空格

    我想从控制台获取字符数组 它还包含空格 我在 C 中知道的唯一方法是 scanf 但是一旦遇到空格 它就会停止接受输入 我该做什么 这就是我正在做的事情 char address 100 scanf s address 尝试使用 fgets
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • 如何在realm-dotnet中存储System.Collections.Generic.Dictionary

    我正在尝试将 Realm NET 集成到我的 uwp 项目中 我想知道是否有任何方法可以在 Realm dotnet 库中存储 System Collections Generic Dictionary 我试过这个 public class
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C

随机推荐

  • 检查 windows/page/document/iframe 是否有焦点

    我已经问过类似的问题 但我需要它来解决更具体的情况 所以我决定提出一个新问题 以免混淆 检查窗口是否有焦点 https stackoverflow com questions 17389280 check if window has foc
  • 确保一次仅运行一个 setTimeout(处于活动状态)?

    递归setTimeout函数 getRandomProducts 被调用onload在html body标签中 如此不断地迭代 正在调用函数 setCategoryTreeonclick来自导航栏嵌套 ul 中的链接 然后 该函数将变量 m
  • 图像处理中的联合直方图和边缘直方图是什么?

    什么是图像处理中的联合直方图和边缘直方图 它们如何工作以及如何构建联合直方图和边缘直方图 如果可能的话 提供简单的示例 例如 如果我有 10 个维度的特征空间 并且想要构建一个直方图 每个维度量化为 20 个值 如何计算联合直方图和边缘直方
  • gem 已安装,但“rails”命令不起作用

    当我运行任何 Rails 命令时 例如rails s我收到以下错误 在任何来源中均找不到 diff lcs 1 1 2 尝试跑步bundle install 不过 我已经安装了 diff lcs 捆绑显示 diff lcs opt loca
  • 为什么使用 SpringJUnit4ClassRunner/MySQL/Spring/Hibernate 时事务不回滚

    我正在进行单元测试 我希望提交给 MySQL 数据库的所有数据都将被回滚 但事实并非如此 尽管我的日志显示正在发生回滚 但数据正在提交 我已经为此奋斗了几天 所以我的设置发生了很大变化 这是我当前的设置 登录DAOTest java Run
  • C++ 中紧密耦合的并行类层次结构

    对于上下文 我正在研究 C 人工生命系统 http github com taliesinb floatworld 涉及由循环神经网络控制的代理 但细节并不重要 我需要将代理的 大脑 和 身体 的两个对象层次结构分开 我想要各种不同的大脑和
  • 抛出新的异常最佳实践[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 以下是好的做法吗 如果不是 应该做什
  • 如何使用 .NET / GDI+ 禁用子采样?

    我正在尝试使用 Bitmap 类保存 JPEG 图像 我注意到无论我指定的质量级别如何 锐利的边缘总是模糊的 我发现这是由于一个或多个通道的二次采样造成的 如何在保存图像时禁用子采样 我目前正在使用这段代码 EncoderParameter
  • 在“世界风”中单击时禁用地球仪移动

    我正在尝试在 世界风 中单击鼠标禁用地球仪的移动 我期望能够做到 void disableGlobeDrag WorldWindowGLCanvas ww ww addMouseMotionListener new MyMouseMotio
  • 获取 S&P 500 股票代码列表

    所以我用这个在 Python for Finance 上 它总是给我错误 1 line 22 in
  • 在 Windows 上的 Emacs 内从 py-shell 运行 Matplotlib 或 enthought.mayavi.mlab

    我可以从常规 cmd shell 正常运行以下代码 import matplotlib pyplot as plt fig plt figure plt show 它启动一个 Matplotlib 窗口 然而 使用 shell 或 py s
  • 在 web.config 的 appSettings 中使用“&”

    我正在尝试将网站地址存储在 web config 文件的 appSettings 部分中 URL 末尾有两个查询字符串参数 因此我需要使用 符号 当我在代码文件中硬编码 URL 时 如果我替换它就可以工作 amp 在配置文件中 这些字母是红
  • django 查询集上的复杂注释

    我遇到一个问题 无法从复杂的环境中获取所需的所有信息 annotate 调用我的 django 视图 这是我的模型 RECORD STATUS 0 Hidden 1 Unhidden 2 Deleted class Activity mod
  • 模拟网络连接不良

    我正在开发一个可以通过 LAN 访问互联网的嵌入式设备 我现在正处于测试阶段 我想测试当互联网连接较差时设备的性能 目前 该设备通过集线器连接到路由器 我用集线器通过 Wireshark 监控数据包 降低设备的互联网速度以模拟可能发生的场景
  • R计算数据帧中相似行的出现次数

    我有以下格式的数据 称为 DF 这只是一个简化的示例 eval num eval count fitness fitness mean green h 0 green v 0 offset 0 random 1 1 1500 1500 10
  • Winform 更新长时间运行的任务

    当应用程序执行长时间运行的任务时 您是否有一个好的解决方案来保持 请稍候 winform 绘制 我尝试在每个步骤中使用 form refresh 但是会发生一些长时间运行的查询 这意味着这不够频繁 基本上是这个那么问题 https stac
  • 简单英语中的乔姆斯基层次结构

    我试图找到乔姆斯基提出的 4 个级别的正式语法 无限制 上下文相关 上下文无关 常规 的简单 即非形式 解释 我已经很久没有学习正式语法了 各种定义现在让我难以想象 明确地说 我是not寻找随处可见的正式定义 例如here http en
  • 如何在管理面板中使用动态数据?

    class Message models Model date models DateField user models ForeignKey UserEx groups models ManyToManyField Group main
  • 如何通过仅编写一次来在客户端和服务器之间共享域类和业务规则,就像在 RIA 服务中一样

    在 ASP NET WCF 应用程序中 我希望在客户端和服务器之间共享域类和业务规则 而不需要重写它们 就像在 Silverlight RIA 服务中一样 将这些收集在一个程序集中并从客户端和服务器引用它可以解决问题 但是如何解决 通过向客
  • 反应性可观察订阅处置

    如果我有权访问一个我知道只会返回一项的 IObservable 这是否有效 它是最佳使用模式吗 IDisposable disposable null disposable myObservable Subscribe x gt DoThi