是否有适用于.NET/C#的actors并发模型的良好实现?
我需要优化一个C#例程,我认为Actor模型是解决我的问题的完美方案。不幸的是,我只有使用Scala实现的经验。
是否有适用于.NET/C#的actors并发模型的良好实现?
我需要优化一个C#例程,我认为Actor模型是解决我的问题的完美方案。不幸的是,我只有使用Scala实现的经验。
一个适用于 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
如已提及的那样,F#的MailboxProcessor类为Actor模型提供了一个简单、直接的实现。如何使用它的精彩介绍这里可用。F#与C#非常配合,您可以将代理封装在具有不同消息的方法的类中。对于代理将以异步响应回复的情况,请参见PostAndAsyncReply方法。这会返回一个Async工作流,您可以使用Async.StartAsTask方法将其转换为可以在C#中等待的任务。
最后,如果您需要远程分发Actor,我建议您查看Akka.NET,它提供了C#和F# API。