私は Don Syme のブログ記事Async and Parallel Design Patterns in F#: Agentsの 1 つを読んでいました。ただし、次の一見非常に単純なコードでは、期待どおりの出力が生成されませんでした。
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 ステートメントを次の File op に置き換えようとしたところ、同じ部分的な結果になりました。
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)