《通过C#学Proto.Actor模型》之Behaviors
2018-09-01 08:43
375 查看
Behaviors就是Actor接收到消息后可以改变处理的方法,相同的Actor,每次调用,转到不同的Actor内方法执行,非常适合按流程进行的场景。Behaviors就通过在Actor内部实例化一个Behavior对象,然后通过这个对象的Become来切换执行的方法的。
码友看码:
using Proto; using System; using System.Threading.Tasks; namespace P007_Behaviors { class Program { static void Main(string[] args) { var props = Actor.FromProducer(() => new LightBulb()); var pid = Actor.Spawn(props); while (true) { Console.WriteLine("----------------------------"); Console.WriteLine("按开关"); Console.ReadLine(); var message = pid.RequestAsync<string>(new PressSwitch()).Result; Console.WriteLine(message); message = pid.RequestAsync<string>(new Touch()).Result; Console.WriteLine(message); } } } public class LightBulb : IActor { private readonly Behavior _behavior; public LightBulb() { _behavior = new Behavior(); //把Off方法放入栈 _behavior.BecomeStacked(Off); } public Task ReceiveAsync(IContext context) { //切换到behavior指定的方法,来充当ReceiveAsync return _behavior.ReceiveAsync(context); } /// <summary> /// 关 /// </summary> /// <param name="context"></param> /// <returns></returns> private Task Off(IContext context) { switch (context.Message) { case PressSwitch _: context.Respond("打开"); _behavior.Become(On); break; case Touch _: context.Respond("凉的"); break; } return Actor.Done; } /// <summary> /// 开 /// </summary> /// <param name="context"></param> /// <returns></returns> private Task On(IContext context) { switch (context.Message) { case PressSwitch _: context.Respond("关闭"); _behavior.Become(Off); break; case Touch _: context.Respond("烫手"); break; } return Actor.Done; } } class PressSwitch { } class Touch { } }
几个要点,在Actor构造中把Off放入方法栈,在Receive中调用Behavior的Receive,同时可以按自己业务逻辑切换方法,这样在一定程度上增加了Actor的灵活性,让一个Actor可以按设定流程实现不同行为。
Behavior提供了三个切换方法相关的方法:
- Become只需将传递的Receive方法设置为当前方法,替换默认方法。
- BecomeStacked将传递的Receive方法推送到方法堆栈,但保留以前的方法。
- UnbecomeStacked 恢复到以前使用的方法。
看结果:
相关文章推荐
- 《通过C#学Proto.Actor模型》之Persistence
- 通过C#学Proto.Actor模型》之Remote
- 《通过C#学Proto.Actor模型》之Mailbox
- 《通过C#学Proto.Actor模型》之Spawning
- 《通过C#学Proto.Actor模型》之PID
- C#通过AMO对象模型浏览SQL SERVER 2005 SSAS角色一例
- 老南瓜:C#通过AMO对象模型浏览SQL SERVER 2005 SSAS角色一例
- C#与Java通过protobuf进行网络通信过程中遇到的问题
- 【protobuf进阶】通过.proto文件导出C#支持的.cs类文件
- 老南瓜:C#通过AMO对象模型浏览SQL SERVER 2005 SSAS角色一例
- C#通过AMO对象模型浏览SQL SERVER 2005 SSAS角色一例
- 通过生产-消费模型了解C#线程同步
- 通过Actor模型解决C++ 并发编程的一种思维 — Theron 库简述
- Actor 并发模型 & "不要通过共享内存来通信,而应该通过通信来共享内存"
- C#通过编程方式实现Ping
- Groovy中的Actor模型_网页设计
- (经济危机来了,牛奶断了)C#中的事件模型:
- C# 通过接口 post 请求
- C# 对字段忽略模型校验
- 通过API实现C#对硬件的控制(二)