首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查询MailboxProcessor状态?

如何查询MailboxProcessor状态?
EN

Stack Overflow用户
提问于 2015-01-23 09:22:41
回答 1查看 220关注 0票数 2

我想要实现的是让一个代理负责操作项目地图。这是一个简单的聚会,但现在我想知道如何在地图上查询?

看看下面的代码:

代码语言:javascript
复制
(* APPLIACATION STATE *)
let rec timeTable = Map.empty<string, TimeTableEntry>

let timeTableAgent = new TimeTableAgent(fun inbox -> 
   (* Internal functions *)
    let validateCronExpr task = 
        try
            task.CronExpr |> CrontabSchedule.Parse |> Success
        with | ex -> Failure "Cron expression is invalid."

    let rec schedule (timeTable : Map<string, TimeTableEntry>) (entry : TimeTableEntry) = 
        match validateCronExpr(entry) with
        | Failure err -> Failure err
        | Success _ -> match timeTable.ContainsKey(entry.Name) with
                       | false ->
                            let timeTable = timeTable.Add(entry.Name, entry)
                            Success "Task has been scheduled."
                       | true -> Failure "Task already exists."


   (* message processing *)
    let rec messageLoop (timeTable : Map<string, TimeTableEntry>) = 
        async {
            let! message = inbox.Receive()

            match message with
            | Command.Schedule (entry, reply) ->
                 let timeTable = timeTable.Add(entry.Name, entry)
                 reply.Reply(schedule timeTable entry)
            | Command.RecalculateOccurance (key, reply) -> reply.Reply(Success("OK"))
            | Command.UnSchedule (key, reply) -> reply.Reply(Success("OK"))

            return! messageLoop timeTable
     }

    // start the loop
    messageLoop timeTable
   )
timeTableAgent.Start()

let task = { Name = ""; CronExpr = "* * * * *"; Job = FileName("");    NextOccurance = DateTime.Now }


let messageAsync = timeTableAgent.PostAndAsyncReply(fun replyChannel -> Command.Schedule(task, replyChannel))

所以现在我想做这样的事情:

代码语言:javascript
复制
printf "%i" timeTable.Count

timeTable |> Map.iter (fun k v -> printf "%s" v.Name) 

但是项目计数为0,查询不返回任何内容:(

我知道时间表的状态是不变的,但我记得用新的实例替换不可变的vars是可能的.

有人能帮我一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-23 14:58:45

以上面的例子为例,您可以执行以下操作。

在代理消息处理程序中,添加另一个命令

代码语言:javascript
复制
(** Previous match clauses **)
| Command.GetCount(reply) -> 
    reply.Reply(timeTable.Count)

然后,可以使用该命令查询代理状态的视图。

代码语言:javascript
复制
let timeTableCount = timeTableAgent.PostandReply(Command.GetCount)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28106611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档