我有一个MailBoxProcessor
,它做以下事情:
-
主回路(
type AsyncRunner
:https://github.com/kkkmail/ClmFSharp/blob/master/Clm/ContGen/AsyncRun.fs#L257–随着我不断更新代码,行号可能会发生变化)。它生成一些"模型",将每个模型编译到一个特定于模型的文件夹中,将它们派生为外部进程,然后每个模型使用WCF通过调用updateProgress
来"通知"AsyncRunner
其进度。一个模型可能需要几天才能运行。一旦任何一个模型完成,跑步者就会生成/繁殖更多。设计以100%的处理器负载运行(但具有优先级:ProcessPriorityClass.BelowNormal
),尽管我可以指定较少数量的逻辑内核来使用(介于1和Environment.ProcessorCount
之间的某个数字)。目前,我使用… |> Async.Start
"异步"处理了MailBoxProcessor
中的几乎所有内容,以确保我"永远不会"阻塞主循环。 -
我可以通过调用
member this.getState () = messageLoop.PostAndReply GetState
来"询问"运行程序(使用WCF)的状态。 -
或者我可以向它发送一些命令(再次使用WCF),例如
member this.start()
、member this.stop()
…
这里是它变得有趣的地方。一切正常!然而,如果我运行一个"监视器",它会通过在无限循环中有效地调用PostAndReply
(公开为this.getState ()
)来请求状态,那么过一段时间就会挂断。我的意思是,它确实最终会返回,但会有一些不可预测的大延迟(比如几分钟)。同时,我可以发出命令,它们会很快返回,而getState
仍然没有返回。
有可能使其在接近100%的负载下做出响应吗?非常感谢!
我建议不要在主程序中异步任何东西(除了进程的生成),因为您的代码会创建额外的进程。您的主循环正在等待循环返回继续,然后再处理GetState()方法。