1

我有一个MailBoxProcessor,它执行以下操作:

  1. 主循环(type AsyncRunnerhttps ://github.com/kkkmail/ClmFSharp/blob/master/Clm/ContGen/AsyncRun.fs#L257 - 行号可能会随着我不断更新代码而改变)。它生成一些“模型”,将它们中的每一个编译到特定于模型的文件夹中,将它们作为外部进程生成,然后每个模型使用 WCFAsyncRunner通过调用updateProgress. 一个模型可能需要几天时间才能运行。一旦完成任何模型,跑步者就会生成/产生更多。它被设计为以 100% 的处理器负载运行(但优先ProcessPriorityClass.BelowNormalEnvironment.ProcessorCountMailBoxProcessor目前,我通过使用“异步”编辑了几乎所有内容… |> Async.Start以确保我“永远不会”阻塞主循环。

  2. 我可以通过调用member this.getState () = messageLoop.PostAndReply GetState.

  3. 或者我可以向它发送一些命令(再次使用 WCF),例如member this.start(), member this.stop(), ...</p>

这就是有趣的地方。一切正常!PostAndReply但是,如果我运行一个“监视器”,它会通过在无限循环中有效地调用(暴露为)来请求一个状态this.getState (),过一会儿它就会挂断。我的意思是它最终会返回,但会有一些无法预测的大延迟(比如几分钟)。同时,我可以发出命令,它们确实快速返回,但getState仍然没有返回。

是否有可能使其在接近 100% 的负载下响应?非常感谢!

4

1 回答 1

0

我建议不要在你的主程序中异步任何东西(除了你产生的进程),因为你的代码会创建额外的进程。在处理 GetState() 方法之前,您的主循环正在等待循环返回以继续。

于 2019-01-17T04:51:01.967 回答