2

我正在阅读 Don Syme 的一篇博文Async and Parallel Design Patterns in F#: Agents。但是,以下看似极其简单的代码并没有按预期生成输出。

type Agent<'T> = MailboxProcessor<'T>

let agent =
   Agent.Start(fun inbox ->
     async { while true do
               let! msg = inbox.Receive()
               printfn "got message '%s'" msg } )

for i in 1 .. 10000 do
   agent.Post (sprintf "message %d" i)

而不是预期的 10,000 条消息,我在 Ubuntu 下使用 Mono 2.8.1 只收到大约 3000 条消息,或者在 Windows XP 下使用 Visual F# 得到 15 条消息。我在这里错过了什么吗?顺便说一句,我尝试用以下文件操作替换 printfn 语句,并得到相同的部分结果。

open System.IO
type Agent<'T> = MailboxProcessor<'T>

let agent =
   Agent.Start(fun inbox ->
     async { while true do
               let! msg = inbox.Receive()
               use logger = new StreamWriter("a.log", true)
               logger.WriteLine("got message '{0}'", msg.ToString())
               logger.Close() 
           } )

for i in 1 .. 10000 do
   agent.Post (sprintf "message %d" i)
4

1 回答 1

5

只需在 Win 机器上运行您的代码 - 一切正常。尝试添加

ignore( System.Console.ReadKey() )

作为最后一行,因为 agent.Post 是非阻塞的,并且在发布 10000 条消息后,控制流将向前移动,可能会退出程序。

于 2011-03-01T16:17:42.193 回答