有没有适用于C#的Actor模型的好实现?

78

是否有适用于.NET/C#的actors并发模型的良好实现?

我需要优化一个C#例程,我认为Actor模型是解决我的问题的完美方案。不幸的是,我只有使用Scala实现的经验。


http://blogs.msdn.com/b/dotnet/archive/2014/04/02/available-now-preview-of-project-orleans-cloud-services-at-scale.aspx - Daniel Little
13个回答

0

FSharp.Actor

一个适用于 F# 的演员框架。

来自一个示例:

let rec schizoPing =
    (fun (actor:IActor<_>) ->
        let log = (actor :?> Actor.T<_>).Log
        let rec ping() =
            async {
                let! (msg,_) = actor.Receive()
                log.Info(sprintf "(%A): %A ping" actor msg, None)
                return! pong()
            }
        and pong() =
            async {
                let! (msg,_) = actor.Receive()
                log.Info(sprintf "(%A): %A pong" actor msg, None)
                return! ping()
            }
        ping()
    )

向“分裂”演员发送两条消息的结果是:
let schizo = Actor.spawn (Actor.Options.Create("schizo")) schizoPing

!!"schizo" <-- "Hello"
!!"schizo" <-- "Hello"

输出:

(schizo): "Hello" ping
(schizo): "Hello" pong

githubdocs上找到它。

0

刚刚注意到这个问题,并想要添加一个新的数据点。微软目前有一个半官方的项目,叫做ActorFX。它是开源的,仍在不断发展中,但值得关注...


0

如已提及的那样,F#的MailboxProcessor类为Actor模型提供了一个简单、直接的实现。如何使用它的精彩介绍这里可用。F#与C#非常配合,您可以将代理封装在具有不同消息的方法的类中。对于代理将以异步响应回复的情况,请参见PostAndAsyncReply方法。这会返回一个Async工作流,您可以使用Async.StartAsTask方法将其转换为可以在C#中等待的任务。

最后,如果您需要远程分发Actor,我建议您查看Akka.NET,它提供了C#和F# API。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接