问题标签 [mailboxprocessor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
user-interface - 如何在具有响应式 UI 的异步可取消工作流中准备数据的正确方法
这个问题是基于Async.TryCancelled 不适用于 Async.RunSynchronously看起来很复杂,所以我将削减一个我尝试解决的简单部分。
假设我有这个功能:
prepareModel
准备应该显示给用户的数据。updateUI
刷新 UI(删除旧控件并根据新数据创建新 ctl)。
问题:我应该如何调用这两个函数以便可以prepareModel
随时取消?
流量是
- 用户点击刷新
prepareModel
(1) 异步启动和运行,因此 UI 是响应式的,用户可以使用应用程序
- 用户更改数据并再次单击刷新
prepareModel
(1) from 被取消,newprepareModel
(2) 开始
- 用户更改数据并再次单击刷新
prepareModel
(2) 被取消并prepareModel
开始新的 (3)- ..
prepareModel
(n) 完成updateUI
在 UI 线程上运行,重绘 UI
(我的第一个解决方案基于MailboxProcessor
确保只prepareModel
执行一个,请参阅Async.TryCancelled 不适用于 Async.RunSynchronously但当我对此进行试验时,它不是没有错误的)
asynchronous - 异步和 CancellationTokens/CancellationTokenSource 内存问题
我仍在寻找内存泄漏,我注意到以下内容:
我有很多来自 F# 的默认取消令牌源(异步工作流)的 System.Threading.CancellationCallbackInfo-Objects 的实时实例。
如果您自己声明一个 Source 并在 MailboxProcessor 中使用它来跨越子级或任务,问题会变得更糟。
似乎 GC 无法收集那些跨越的任务/工作流,因为 CancellationTokenSource 持有这样的引用:
大多数 CancellationCallbackInfo-Objects 都进入了 Gen2 - 令人难以置信,因为我只是在 MailboxProcessors-“循环”工作流程中使用本地引用......
这是一个已知问题,是否有解决方案/解决方法?
现在我停止使用 Cancellation-support 并通过代码线程 ManualResetEvents ......一点都不好:(
f# - 邮件到达邮箱处理器的顺序
是否有/我怎样才能保证发送到邮箱处理器的消息的到达顺序
也就是说,如果我这样做了
我如何确定在代理的处理循环中,消息将按顺序接收?
multithreading - Async.Start 的成本
在邮箱处理器循环中,我从先前存储在此类集合中的阻塞集合中读取项目。由于我使用相同的循环来写入此类集合,因此我需要将其作为线程启动。
我的整个代码的执行速度很慢(相对而言),我怀疑原因是我启动的新线程,尽管我启动了线程池
争论点可能在这里的另一个提示是,如果我仅在队列为空时启动(并锁定整个部分)),我的运行时间差异很大,从 350 毫秒到 7 秒,而如果不这样做,它会保持在 5- 10 秒。
我的问题是:
- 无论如何我可以在这里加速线程的创建
- 是否有一些结构已经可以在邮箱处理器中使用这种情况(消费者/生产者?)?
wcf - f# 中长时间运行的代理
我以不同的方式使用代理,其中一种由 100 个代理监控网站更改组成,并向主管报告,我可以调用它来生成新的监视器,或收听合并的更改。这只是我计划的一部分,我对此很满意。我现在想将它分离出来,让它真正独立于我的主程序运行。
(但我希望这个独立的衍生产品尽可能多地保留在语言中,并尽可能使用最少的胶水代码)
我在这里有什么策略/你会推荐什么?
f# - 为什么我的 MailboxProcessor 挂起?
我无法弄清楚为什么以下代码在调用GetTotal
. 我似乎无法在 MailboxProcessor 内部进行调试,因此很难看到发生了什么。
Aggregator
直接使用相同的 MailboxProcessor 而不是包装在类中时,它似乎工作正常。
f# - MailboxProcessor 和异常
我想知道,为什么MailboxProcessor
处理异常的默认策略只是默默地忽略它们。例如:
什么也没有发生。程序执行没有致命停止,或出现“未处理异常”的消息框。没有。
如果有人使用PostAndReply
方法,这种情况会变得更糟:结果是保证死锁。
这种行为有什么原因吗?
f# - 统一任务和 F# MailboxProcessor 异常处理
使用Task<T>时,在Task.Wait()期间抛出任务执行过程中的异常;使用 F# 的 MailBoxProcessor 时,异常被吞没,需要根据这个问题明确处理。
这种差异使得很难通过任务将 F# 代理公开给 C# 代码。例如,这个代理:
可以从 C# 调用,但异常不会返回到 C#:
C# 代码没有得到异常,而是挂在 task.Wait() 处。有没有办法让 F# 代理表现得像一个任务?如果没有,似乎将 F# 代理暴露给其他 .NET 代码的用途有限。
f# - 懒惰..但 F# 中的急切数据加载器
有谁知道关于以下主题的“现有技术”:
- 我的数据需要一些不错的时间才能加载。它们是各种股票的历史水平。
- 我想以某种方式预加载它们,以避免使用我的应用程序时的延迟
- 但是,在开始时将它们预加载到一个块中会使我的应用程序首先无响应,这对用户不友好
所以我不想加载我的数据....除非用户没有请求任何数据并使用他已经拥有的东西,在这种情况下我想一点一点地得到。所以它既不是“懒惰”也不是“渴望”,更多的是“当你需要时懒惰”和“当你可以时渴望”,因此是首字母缩写词 LWYNEWYC。
我做了以下似乎可行的方法,但我只是想知道是否有一种公认的和有福的方法来处理这种事情?
和类
exception - F# MailboxProcessor - 邮箱的多个等待读者延续
我正在玩写一个非常简单的异步测试框架之类的东西。但我认为我遇到了某种限制或错误。抱歉,我无法在较小的代码库上重现它。
这是我提出的基本框架:
现在,仅当我使用一组特定的测试在网络上进行一些爬网时才会触发异常(有些失败,有些则没有,这很好):
https://github.com/matthid/Yaaf.GameMediaManager/blob/core/src/Yaaf.GameMediaManager.Primitives/EslGrabber.fs是代码,你可以下载https://github.com/downloads/matthid/Yaaf。 GameMediaManager/GameMediaManager.%200.9.3.1.wireplugin(这基本上是一个重命名的 zip 存档)并将其解压缩以获取 Yaaf.GameMediaManager.Primitives.dll 二进制文件(您可以将其粘贴到 FSI 中,而不是在需要时下载,但随后您就有了引用 HtmlAgilityPack)
我可以使用 Microsoft (R) F# 2.0 Interactive, Build 4.0.40219.1 重现这一点。问题是异常不会总是(但经常)被触发,并且堆栈跟踪什么也没告诉我
因为这将在我无法控制的工作线程上触发,所以这会使应用程序崩溃(不是 FSI,但这里也会显示异常)。
我找到了http://cs.hubfs.net/topic/Some/2/59152和http://cs.hubfs.net/topic/None/59146但我不使用 StartChild 我不认为我是以某种方式同时从多个线程调用接收?
我的代码有什么问题还是这确实是一个错误?如果可能的话,我该如何解决这个问题?
我注意到在 FSI 中,当 Exception 被静默忽略时,所有测试都将按预期运行。我该怎么做?
编辑:我在修复失败的单元测试后注意到它会正常工作。但是我仍然不能用更小的代码库来重现这个。例如,我自己的失败测试。
谢谢,马蒂德