F# 如何使用MailboxProcessor创建作业队列?

F# 如何使用MailboxProcessor创建作业队列?,f#,F#,我正在尝试使用MailboxProcessor建模一个异步作业处理框架。我的要求是启动、停止、暂停和恢复作业处理器。我可以用MailboxProcessor构建暂停/恢复功能吗?我也应该能够停止和启动?我正在尝试模仿Windows服务 我有一个C#系统,使用队列/线程实现。我在寻找设计替代方案,那是我看到MailboxProcessor的时候。我相信我可以使用它,但我不知道如何处理上述情况。那么有可能实现此功能吗?当然:)只需保留一个内部作业队列,并在作业处理器处于启动模式时枚举队列即可。在任何

我正在尝试使用MailboxProcessor建模一个异步作业处理框架。我的要求是启动、停止、暂停和恢复作业处理器。我可以用MailboxProcessor构建暂停/恢复功能吗?我也应该能够停止和启动?我正在尝试模仿Windows服务

我有一个C#系统,使用队列/线程实现。我在寻找设计替代方案,那是我看到MailboxProcessor的时候。我相信我可以使用它,但我不知道如何处理上述情况。那么有可能实现此功能吗?

当然:)只需保留一个内部作业队列,并在作业处理器处于启动模式时枚举队列即可。在任何其他模式下,只需将新作业排队,直到处理器进入启动模式

type 'a msg =       // '
    | Start
    | Stop
    | Pause
    | Job of (unit -> unit)

type processQueue() =        
    let mb = MailboxProcessor.Start(fun inbox ->
        let rec loop state (jobs : System.Collections.Generic.Queue<_>) =
            async {
                if state = Start then
                    while jobs.Count > 0 do
                        let f = jobs.Dequeue()
                        f()

                let! msg = inbox.Receive()
                match msg with
                | Start -> return! loop Start jobs
                | Pause -> return! loop Pause jobs
                | Job(f) -> jobs.Enqueue(f); return! loop state jobs
                | Stop -> return ()
            }
        loop Start (new System.Collections.Generic.Queue<_>()))

    member this.Resume() = mb.Post(Start)
    member this.Stop() = mb.Post(Stop)
    member this.Pause() = mb.Post(Pause)
    member this.QueueJob(f) = mb.Post(Job f)
键入'a msg=/'
|开始
|停止
|停顿
|作业(单位->单位)
键入processQueue()=
让mb=MailboxProcessor.Start(有趣的收件箱->
let rec循环状态(作业:System.Collections.Generic.Queue)=
异步的{
如果状态=开始,则
而jobs.Count>0则可以
设f=jobs.Dequeue()
f()
let!msg=inbox.Receive()
配味精
|开始->返回!循环开始作业
|暂停->返回!循环暂停作业
|作业(f)->jobs.Enqueue(f);返回!循环状态作业
|停止->返回()
}
循环启动(新的System.Collections.Generic.Queue())
成员this.Resume()=mb.Post(开始)
成员this.Stop()=mb.Post(Stop)
成员this.Pause()=mb.Post(暂停)
成员this.QueueJob(f)=mb.Post(作业f)
此类的行为与预期的一样:可以在暂停状态下将作业排队,但它们只能在开始状态下运行。一旦processQueue停止,它就无法重新启动,并且所有排队的作业都不会运行(很容易改变这种行为,这样,它就不会在停止状态下将作业排队,而不是终止队列)


如果您需要邮箱处理器和代码之间的双向通信,请使用。

您可能希望签出,因为我认为它已经签出。

+1轻微改进:您可以通过明确状态使代码更清晰。然后,您还可以将所有状态封装在
状态
类型中,特别是,只有
暂停
状态才会有队列。此外,您可能希望将状态表示为相互递归的异步工作流……作业队列上的此块在完成之前不会被阻塞吗?这似乎会使
暂停
无效。