《通过C#学Proto.Actor模型》之Behaviors
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模型》之Behaviors的更多相关文章
- 《通过C#学Proto.Actor模型》之 HelloWorld
在微服务中,数据最终一致性的一个解决方案是通过有状态的Actor模型来达到,那什么是Actor模型呢? Actor是并行的计算模型,包含状态,行为,并且包含一个邮箱,来异步处理消息. 关于Actor的 ...
- 《通过C#学Proto.Actor模型》之Mailbox
邮箱是Actor模型的一个重要组成部分,负责接收发过来的消息,并保存起来,等待Actor处理.邮箱中维护着两种队列,一种是存系统消息,另一个是存用户消息,系统省是指Started,Stoping,St ...
- 《通过C#学Proto.Actor模型》之Prpos
在第一篇Proto.Actor博文中,HelloWorld的第一行真正代码是: var props = Actor.FromProducer(() => new HelloActor()) ...
- 通过C#学Proto.Actor模型》之Remote
Proto.Actor中提供了基于tcp/ip的通迅来实现Remote,可以通过其Remot实现对Actor的调用. 先来看一个极简单片的远程调用. 码友看码: 引用NuGet包 Proto.Acto ...
- 《通过C#学Proto.Actor模型》之Persistence
Actor是有状态的,当每一步执行失败后,返回失败地方继续执行时,希望此时的状态是正确的,为了保证这一点,持久化就成了必要的环节了. Proto.Actor提供了三种方式执久化: Event Sour ...
- 《通过C#学Proto.Actor模型》之Supervision
Supervision,字面意思是监督,是父Actor发现子Actor有异常发生后,对子Actor产用保种策略处理的机制,如果父Actor不处理,则往上传递. 子Actor发生异常后处理的策略有: R ...
- 《通过C#学Proto.Actor模型》之PID
PID对象是代表Actor对象的进程,是能过Actor.Spawn(props)获取的:它有什么成员呢?既然代理Actor,首先有一个ID,标识自己是谁,Actor在Spawn时可以命名这个ID,否则 ...
- 《通过C#学Proto.Actor模型》之Spawning
Props是配置Actor和实例化Actor,那实例化后,就应该访问了,Props.Actor提供了Actor.Spawn(),Actor.SpawnPrefix(),Actor.SpawnNamed ...
- Proto.Actor模型
Proto.Actor模型 http://proto.actor/ https://github.com/axzxs2001/ProtoActorSample https://www.cnblogs. ...
随机推荐
- PC逆向之代码还原技术,第二讲寻找程序入口点
PC逆向之代码还原技术,第二讲寻找程序入口点 一丶简介 程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的. 比如VC++6.0 我们可以写一个程序测试一下 我们写一段代码 ...
- Docker系列09—Docker的系统资源限制及验证
本文收录在容器技术学习系列文章总目录 1.限制容器的资源 默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源.Docker提供了控制容器可以使用多少内存或CPU的方法,设置 ...
- springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试
包结构 所需要的jar包直接拷贝到lib目录下 然后选定 build path 之后开始写项目代码 配置文件 ApplicationContext.xml <?xml version=" ...
- Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...
- Ubuntu中安装 mercurial – TortoiseHG
sudo add-apt-repository ppa:tortoisehg-ppa/releases sudo add-apt-repository ppa:mercurial-ppa/releas ...
- Java GUI 单机版五子棋
前言 刚开始学java时接触到GUI,一时兴起写了个五子棋,五子棋的关键点在于判断输赢,其他的都没什么,现在翻出来整理并记录下来,不足之处还望各位路过的大佬多多指教. 代码实现 代码不多,四百多行,全 ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)
Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一) 接上一篇 3. Nginx配置反向代理 3.1 cnetos 安装nginx 首先,我们需要在服务器上安装N ...
- [PHP] 简单多进程并发
企邮搬家进程管理逻辑,经过简化后的功能实现 <?php //守护进程 umask(0); //把文件掩码清0 if (pcntl_fork() != 0){ //是父进程,父进程退出 exit( ...
- Dynamics 365出现数据加密错误怎么办?
本人微信公众号:微软动态CRM专家罗勇 ,回复290或者20181227可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . Dy ...
- 控制台程序(C#)不弹出认证窗口连接到Dynamics CRM Online的Web API
摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复271或者20180602可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...