为什么这个F#代码在与MailboxProcessor一起使用时不会产生预期的输出?

时间:2011-03-01 16:10:40

标签: f# asynchronous agent mailboxprocessor

我正在浏览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)

1 个答案:

答案 0 :(得分:5)

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

ignore( System.Console.ReadKey() )

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