首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自C#的MailboxProcessor<T>

来自C#的MailboxProcessor<T>
EN

Stack Overflow用户
提问于 2011-04-07 21:16:49
回答 2查看 3.6K关注 0票数 13

您是否尝试过使用来自C#的T的MailboxProcessor?你能发布示例代码吗?

你如何开始一个新的,发布消息到它,以及你如何处理它们?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-08 04:45:11

正如我在另一个答案中指出的那样,您可以直接从C#使用MailboxProcessor<T> (使用C# async扩展),但这并不是一件好事--我写这篇文章主要是出于好奇。

MailboxProcessor<T>类型是为在F#中使用而设计的,因此它不适合C#编程模型。您可能会为C#实现类似的应用程序接口,但它不会那么好(肯定不是在C# 4.0中)。TPL DataFlow library (CTP)为未来版本的C#提供了类似的设计。

目前,最好的做法是在F#中使用MailboxProcessor<T>实现代理,并使用Task使其对C#使用友好。这样,您就可以在F#中实现代理的核心部分(使用尾递归和异步工作流),然后在C#中组合和使用它们。

我知道这可能不能直接回答您的问题,但我认为值得举个例子-因为这确实是将F# agents (MailboxProcessor)与C#相结合的唯一合理方法。我最近写了一个简单的“聊天室”演示,下面是一个例子:

代码语言:javascript
复制
type internal ChatMessage = 
  | GetContent of AsyncReplyChannel<string>
  | 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#代理。现在,有趣的部分是以下两个方法,它们将GetContent公开为可从C#使用的异步方法。该方法返回Task对象,可以在C#中以通常的方式使用该对象:

代码语言:javascript
复制
  member x.GetContentAsync() = 
    Async.StartAsTask(agent.PostAndAsyncReply(GetContent))

  member x.GetContentAsync(cancellationToken) = 
    Async.StartAsTask
     ( agent.PostAndAsyncReply(GetContent), 
       cancellationToken = cancellationToken )

这将在C# 4.0中合理地使用(使用Task.WaitAll等标准方法)。而且,当您能够使用C# await关键字处理任务时,它在下一版本的C#中会更好。

票数 18
EN

Stack Overflow用户

发布于 2011-04-07 21:21:07

此解决方案需要C# "async CTP“,但请看一下Agent/MailboxProcessor in C# using new async/await

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5581701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档