mailbox 编程_MailboxProcessor从C#
雖然可以使用MailboxProcessor< T>直接從C#(使用C#異步擴展),如我的另一個答案中所指出的,這不是一件好事 – 我主要是為了好奇而寫的.
郵箱處理器< T>類型被設(shè)計為從F#使用,所以它不適合C#編程模型.你可能可以為C#實現(xiàn)類似的API,但它不會那么好(當(dāng)然不是C#4.0). TPL DataFlow library (CTP)為C#的未來版本提供了類似的設(shè)計.
目前,最好的做法是使用MailboxProcessor< T>實現(xiàn)代理.在F#中,通過使用Task對C#使用做出友好的評價.這樣,您可以在F#(使用尾遞歸和異步工作流程)中實現(xiàn)代理的核心部分,然后組合&使用它們從C#.
我知道這可能不會直接回答你的問題,但我認為這是值得一個例子 – 因為這真的是將F#代理(MailboxProcessor)與C#相結(jié)合的唯一合理的方法.
我最近寫了一個簡單的“聊天室”演示,所以這里是一個例子:
type internal ChatMessage =
| GetContent of AsyncReplyChannel
| SendMessage of string
type ChatRoom() =
let agent = Agent.Start(fun agent ->
let rec loop messages = async {
// Pick next message from the mailbox
let! msg = agent.Receive()
match msg with
| SendMessage msg ->
// Add message to the list & continue
let msg = XElement(XName.Get("li"),msg)
return! loop (msg :: messages)
| GetContent reply ->
// Generate HTML with messages
let html = XElement(XName.Get("ul"),messages)
// Send it back as the reply
reply.Reply(html.ToString())
return! loop messages }
loop [] )
member x.SendMessage(msg) = agent.Post(SendMessage msg)
member x.AsyncGetContent() = agent.PostAndAsyncReply(GetContent)
member x.GetContent() = agent.PostAndReply(GetContent)
到目前為止,這只是一個標準的F#代理.現(xiàn)在,有趣的是以下兩種將GetContent作為可從C#使用的異步方法的方法.該方法返回Task對象,它可以以通常的方式從C#中使用:
member x.GetContentAsync() =
Async.StartAsTask(agent.PostAndAsyncReply(GetContent))
member x.GetContentAsync(cancellationToken) =
Async.StartAsTask
( agent.PostAndAsyncReply(GetContent),cancellationToken = cancellationToken )
這可以從C#4.0(使用諸如Task.WaitAll等等的標準方法)合理使用,并且當(dāng)您可以使用C#await關(guān)鍵字來處理任務(wù)時,下一個版本的C#將會更好.
總結(jié)
以上是生活随笔為你收集整理的mailbox 编程_MailboxProcessor从C#的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: contract forward,菜鸟请
- 下一篇: python用海伦公式求面积_Pytho