Я пытаюсь создать список строк, в который элементы постепенно вставляются асинхронно с помощью процессора почтового ящика. Однако я не получаю желаемого результата.
Я в значительной степени следовал коду из https://fsharpforfunandprofit.com/posts/concurrency-actor-model/ однако в моем случае это не работает должным образом. Код у меня следующий:
type TransactionQueue ={
queue : string list
} with
static member UpdateState (msg : string) (tq : TransactionQueue) =
{tq with queue = (msg :: tq.queue)}
static member Agent = MailboxProcessor.Start(fun inbox ->
let rec msgLoop (t : TransactionQueue) =
async{
let! msg = inbox.Receive()
let newT = TransactionQueue.UpdateState msg t
printfn "%A" newT
return! msgLoop newT
}
msgLoop {queue = []}
)
static member Add i = TransactionQueue.Agent.Post i
[<EntryPoint>]
let main argv =
// test in isolation
printfn "welcome to test"
let rec loop () =
let str = Console.ReadLine()
TransactionQueue.Add str
loop ()
loop ()
0
Результат, который я продолжаю получать, - это список только последнего ввода, состояние не сохраняется. Поэтому, если я введу «a», затем «b», затем «c», в очереди будет только значение «c» вместо «a», «b», «c».
Любая помощь или указатели будут высоко оценены!
Agent
, оцениваются при каждом доступе, т. е. вы получаете новыйMailboxProcessor
каждый раз, когда вызываетеAdd
. - person Charles Mager   schedule 12.05.2019