快速重复 TakeWhile 导致无限循环

2024-05-21

如何使以下可观察的重复,直到stream.DataAvailable为假? 目前看来它永远不会停止。

Defer 部分内的 AsyncReadChunk 和 Observable.Return 进行 OnNext 调用,然后进行 OnCompleted 调用。 当 Repeat 收到 OnNext 调用时,它将其传递给 TakeWhile。当 TakeWhile 不满足时,它会完成可观察量,但我认为 OnNext 之后出现的 OnCompleted 速度太快,以至于导致 Repeat 重新订阅可观察量并导致无限循环。

我该如何纠正这种行为?

public static IObservable<byte[]> AsyncRead(this NetworkStream stream, int bufferSize)
{
    return Observable.Defer(() =>
        {
            try
            {
                return stream.DataAvailable ? AsyncReadChunk(stream, bufferSize) : Observable.Return(new byte[0]);
            }
            catch (Exception)
            {
                return Observable.Return(new byte[0]);
            }
        })
        .Repeat()
        .TakeWhile((dataChunk, index) => dataChunk.Length > 0);
}


自答:(下面是问题作者 Samet 发布的答案。但是,他将答案作为问题的一部分发布。我将其移至单独的答案中,标记为社区 wiki,因为作者尚未移动它他自己。)


我通过重构发现是调度器的问题。 Return 使用 Immediate 调度程序,而 Repeat 使用 CurrentThread。固定代码如下。

    public static IObservable<byte[]> AsyncRead(this NetworkStream stream, int bufferSize)
    {
        return Observable.Defer(() =>
                                    {
                                        try
                                        {
                                            return stream.DataAvailable ? AsyncReadChunk(stream, bufferSize) : Observable.Return(new byte[0], Scheduler.CurrentThread);
                                        }
                                        catch (Exception)
                                        {
                                            return Observable.Return(new byte[0], Scheduler.CurrentThread);
                                        }
                                    })
            .Repeat()
            .TakeWhile((dataChunk, index) => dataChunk.Length > 0);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速重复 TakeWhile 导致无限循环 的相关文章

随机推荐

  • 正则表达式查找数字后跟字母[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我是正则表达式的新手 所以对愚蠢的问题表示歉意 如何识别字符串包含数字后跟字母 例如 在这个地址中 Flat 3a Butterfly St
  • 如何区分列表框中显示的文本和实际值?

    我有一个带有多选选项的列表框 我使用以下方式填充它addItem功能 我在 Google 上找不到任何有关此内容的文章 但我需要区分列表框中显示的文本和实际值 例如 shown hiddenvalue monday A1 tuesday A
  • 如何处理 Flutter 应用程序的深度链接

    如何在 Flutter App 中处理 Web URL 例如 当任何人在 Whatsapp 中点击我的网站链接时 应用程序运行而不是浏览器 我想处理 URL 部分 例如 点击后https example com shop product n
  • 如何使用Python多处理创建同步对象?

    我无法弄清楚如何创建同步的 Python 对象 我有一个名为 Observation 的类和一个名为 Variable 的类 基本上看起来像这样 代码被简化以显示本质 class Observation def init self date
  • 内联还有用吗? [复制]

    这个问题在这里已经有答案了 我相信 inline已经过时了 因为我读过here https isocpp org wiki faq inline functions 无论您如何将函数指定为inline 这是允许编译器忽略的请求 编译器可能会
  • Win 8.1 上的 XAMPP 安装带有 UAC 警告

    我正在尝试在 Windows 8 1 上安装 Xampp win32 1 8 2 我收到一条消息说 由于系统上激活的用户帐户用户帐户 XAMPP 的某些功能可能会受到限制 我尝试更改用户帐户控制设置 但警告仍然存在 并且APACHE无法启动
  • 如何设置行高 Sencha Touch List

    如何设置 Sencha Touch List 对象中的行高 我使用 HTML 来格式化行 多行行会变得更高 但如何设置行高 谢谢 格里 要编辑列表元素的默认高度 有两种方法 使用 SASS 创建您自己的 Sencha 主题 官方 Sench
  • WebStorm HTML 文件显示 HTML 元素的 TypeScript 错误

    我安装了 WebStorm 的新副本并打开了现有的 Angular 项目 当我打开项目中的任何 HTML 文件时 IDE 都会显示 找不到 div div html 文件中的标签 IDE 运行了几秒钟 然后显示 2 5 3 Typescri
  • 在jqGrid中查找当前页码

    如何在 jqGrid 中找到当前页码 当然使用 jQuery 另外我怎么知道总共有多少页 这应该可以做到 sp 1 text total pages ui pg input val current page Edit 我发现了一个更好的方法
  • 使用 DateTime 类计算日期差异时出错

    我正在尝试使用 DateTime 类 php gt 5 3 来计算 2 个日期的差异 手册中的示例简单明了 我尝试了该示例并且效果很好 但如果改变开始和结束日期 就会出现问题 this gt start date 2011 03 01 th
  • 这是内存泄漏还是误报?

    这是我的代码 import java io BufferedReader import java io FileNotFoundException import java io FileReader import java util Sca
  • 为什么我的 DLL 无法注册?

    我正在 VS2005 中构建一个项目 但我的几个 DLL 无法注册 我在 Visual Studio 中收到的错误消息是 项目 错误 PRJ0019 工具从 注册 ActiveX 控件 返回错误代码 这很模糊 当我通过命令行手动注册DLL时
  • 为整个网站设置单个图标

    目前我正在使用这段代码将网站图标添加到网站 但是 必须将此代码添加到每个 HTML 页面中 有谁知道如何设置全局图标 我看过的所有地方都告诉我必须将其添加到每个页面 UPDATE Chrome 在根目录中搜索 favicon ico 文件
  • 似乎有时 Delphi 是区分大小写的 - “覆盖方法应该与祖先的大小写匹配”

    今天我遇到了一个 奇怪 的提示 覆盖方法 xxxx 应匹配祖先 yyyy 的大小写 解决方案是完全按照祖先中的方式声明方法名称 我相信这是自 Delphi Net 编译器以来编译器中保留的东西 与祖先中完全相同的方法声明方法使编译器 沉默
  • 在 WCF 服务上启用 CORS。获取 HTTP 405:不允许的方法

    我正在尝试在 WCF 服务上启用 CORS 当我尝试从客户端发送请求时 该请求是使用OPTIONS动词 我总是得到一个HTTP 405 Method not allowed error 如果我尝试使用 Fiddler 并使用以下命令创建相同
  • 触发器与非规范化存储过程的优缺点

    当涉及到对事务数据库中的数据进行非规范化以提高性能时 至少 有三种不同的方法 通过存储过程推送更新 更新规范化交易数据和非规范化报告 分析数据 在事务表上实现更新辅助表的触发器 这几乎总是维护历史时所采取的路线 将处理推迟到夜间批处理 可能
  • 为什么我们不能将两个推断变量作为匿名类相互分配? [复制]

    这个问题在这里已经有答案了 Java 10 http openjdk java net jeps 286允许做一个anonymous class with a var like var a1 new Object var a2 new Ob
  • jQuery 验证:如何不显示错误?或者如何将错误显示为工具提示?

    我希望我的错误浮动在未验证的输入字段上方 左对齐 我怎样才能做到这一点 如果不能 我怎样才能关闭错误 我仍然希望字段能够验证 并在错误时突出显示 但不希望显示实际的错误消息 我似乎无法在 jQuery 文档中找到任何可以让我打开 关闭它们的
  • 扩展运算符可以用来提供函数参数吗?

    我正在编写扩展 statelessWidget 的类 它的 build 方法返回Text 小部件 我需要将来自构造函数的文本选项 对齐 阶梯等 传递给它Map
  • 快速重复 TakeWhile 导致无限循环

    如何使以下可观察的重复 直到stream DataAvailable为假 目前看来它永远不会停止 Defer 部分内的 AsyncReadChunk 和 Observable Return 进行 OnNext 调用 然后进行 OnCompl