Почему этот код F # не генерирует ожидаемый вывод при использовании с MailboxProcessor? - PullRequest
2 голосов
/ 01 марта 2011

Я просматривал одно из сообщений в блоге Дона Сайма Асинхронные и параллельные шаблоны проектирования в F #: Агенты .Однако следующий, казалось бы, чрезвычайно простой код не сгенерировал вывод, как ожидалось.

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)

Вместо ожидаемых 10000 сообщений я получил только около 3000 сообщений с использованием Mono 2.8.1 под Ubuntu или 15 сообщений с использованием VisualF # под Windows XP.Я что-то здесь упускаю?Кстати, я попытался заменить оператор printfn на следующую опцию File, и в результате я получил те же частичные результаты.

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 Ответ

5 голосов
/ 01 марта 2011

Просто запустите свой код в Win machine - все в порядке.Попробуйте добавить

ignore( System.Console.ReadKey() )

в качестве последней строки, потому что agent.Post не блокирует и после публикации 10000 сообщений поток управления переместится вперед, возможно, выйдя из программы.

...