Akka.NET 控制台应用实战:从 Hello World 消息到 ActorSystem 完整生命周期
后端微服务【免费下载链接】akka.netCanonical actor model implementation for .NET with local distributed actors in C# and F#.项目地址https://gitcode.com/gh_mirrors/ak/akka.net点击查看免费下载本文基于 Akka.NET 官方文档 Console Application 展开完整演示如何用 .NET 控制台宿主搭建一个最小的 Akka.NET 应用定义消息类型Greet、实现ReceiveActor派生 Actor、启动ActorSystem并发送首条消息。读完本篇你将掌握控制台场景下 Actor 的创建、消息投递、生命周期回调PreStart/PostStop以及系统优雅终止的标准写法并能对照仓库源码理解每个 API 背后的实现。一、控制台场景的定位在 部署场景总览 中Akka.NET 将Console Application列为最基础的部署形态控制台应用能让你以最直接的方式观察软件的入口与退出点快速验证一个新的 actor 应用是否按预期启动、处理消息并退出。仓库中对应的可运行示例位于 src/examples/HelloAkka是一个独立的Exe工程仅依赖核心库 src/core/Akka/Akka.csprojProject SdkMicrosoft.NET.Sdk PropertyGroup OutputTypeExe/OutputType TargetFramework$(NetTestVersion)/TargetFramework ImplicitUsingsenable/ImplicitUsings Nullableenable/Nullable IsPackablefalse/IsPackable /PropertyGroup ItemGroup ProjectReference Include..\..\..\core\Akka\Akka.csproj / /ItemGroup /Project从项目结构看Program.cs使用了顶层语句与ImplicitUsings因此无需显式using System.Threading.Tasks即可使用Task.Delay。在仓库中构建并运行该工程的方式为dotnet run --project src/examples/HelloAkka/HelloWorld/HelloWorld.csproj下面按文档的三大步骤逐一讲解消息类 → Actor 类 → 控制台宿主。二、创建消息类Greet向 actor 下达指令的方式就是给它发送消息Greet就是本例中被发送的消息类型源码src/examples/HelloAkka/HelloWorld/Greet.csnamespace HelloWorld { /// summary /// Immutable message type that actor will respond to /// /summary public class Greet { public string Who { get; private set; } public Greet(string who) { Who who; } } }两个值得注意的设计点不可变消息Who属性只有private set消息一旦被构造就不可修改。actor 消息会在actor 间、甚至未来经 Akka.Remote 跨进程传递不可变类型天然避免了多线程环境下的共享状态问题这也是仓库示例刻意强调Immutable message type的原因。类型安全ReceiveActor的ReceiveT按类型分发消息Greet作为独立类型可以精确匹配处理器避免字符串协议式的脆弱约定。三、创建GreetingActorActor 是ReceiveActor的派生类负责响应Greet消息源码src/examples/HelloAkka/HelloWorld/GreetingActor.csusing Akka.Actor; namespace HelloWorld { /// summary /// The actor class /// /summary public class GreetingActor : ReceiveActor { public GreetingActor() { // Tell the actor to respond to the Greet message ReceiveGreet(greet Console.WriteLine($Hello {greet.Who})); } protected override void PreStart() { Console.ForegroundColor ConsoleColor.Green; Console.WriteLine(Good Morning, we are awake!); } protected override void PostStop() { Console.ForegroundColor ConsoleColor.Red; Console.WriteLine(Good Night, going to bed!); } } }生命周期回调PreStart/PostStopPreStart会在 Akka 框架启动该 actor 时被调用PostStop则在 actor 停止之后被调用——本例用绿色打印醒来、红色打印睡觉来可视化这两个时刻。它们是ActorBase生命周期钩子的一部分适合放置初始化资源、订阅/取消订阅、日志等不需要处理消息的逻辑。ReceiveT的底层机制ReceiveActor的源码在 src/core/Akka/Actor/ReceiveActor.cs。从源码结构看其工作机制是ReceiveT只能在 actor 构造函数或Become期间注册处理器否则抛出InvalidOperationException构造函数调用会先压入一个 handler 栈每条入站消息经由sealed的OnReceive(object message)分发给当前 handler 集合ReceiveGreet注册的处理器只匹配Greet类型若没有任何处理器匹配消息会走Unhandled(message)由DeadLetterActorRef等机制兜底除ReceiveT外源码还提供ReceiveAny、带谓词的ReceiveT(PredicateT, ActionT)以及会挂起 actor 直至任务完成的ReceiveAsyncT配合Become/BecomeStacked可以实现行为切换有限状态风格的状态机写法。本例中ReceiveGreet(greet Console.WriteLine($Hello {greet.Who}))即注册了一个同步处理器收到Greet时打印问候语并返回已处理。四、创建控制台宿主Program.cs整个宿主入口只有寥寥数行源码src/examples/HelloAkka/HelloWorld/Program.csusing Akka.Actor; using HelloWorld; // ReSharper disable SuggestVarOrType_SimpleTypes ActorSystem system ActorSystem.Create(the-universe); // create actor and get a reference to it. // this will be an ActorRef, which is not a // reference to the actual actor instance // but rather a client or proxy to it IActorRef greeter system.ActorOfGreetingActor(greeter); // send a message to the actor greeter.Tell(new Greet(World)); // give the actor a moment to process the message // (it should process it in under a micro-second, but it happens asynchronously) await Task.Delay(TimeSpan.FromSeconds(1)); system.Stop(greeter); await system.Terminate();逐段拆解步骤代码说明1ActorSystem.Create(the-universe)创建并立即启动名为the-universe的 actor 系统2system.ActorOfGreetingActor(greeter)创建 actor 并拿到IActorRef——注意它是客户端/代理而非 actor 实例本身3greeter.Tell(new Greet(World))异步投递一条Greet消息4await Task.Delay(1s)给 actor 留出异步处理消息的时间5system.Stop(greeter)向 actor 发起停止请求触发PostStop6await system.Terminate()终止整个 actor 系统进程随之退出五、源码印证每个 API 到底做了什么5.1ActorSystem.Create的四个重载ActorSystem 中Create提供了多个重载ActorSystem.cs#L261-L308public static ActorSystem Create(string name, Config config) // 名称 HOCON 配置 public static ActorSystem Create(string name, BootstrapSetup setup) // 名称 程序化 Bootstrap 配置 public static ActorSystem Create(string name, ActorSystemSetup setup) // 名称 完整 Setup public static ActorSystem Create(string name) // 仅名称本例使用文档示例使用的单参数Create(name)会回退到ConfigurationFactory.Default()加载默认配置reference.conf等因此控制台应用零配置即可运行。源码注释还明确要求系统名必须是 URI 友好的只能包含[a-zA-Z0-9]及非前导的-例如the-universe合法而包含.或空格的名字非法。所有重载最终都汇入私有方法CreateAndStartSystem先new ActorSystemImpl(...)再system.Start()——也就是说Create返回时系统已经处于运行状态。5.2ActorOfT是扩展方法system.ActorOfGreetingActor(greeter)实际调用的是 ActorRefFactoryExtensions 中的扩展方法ActorRefFactoryExtensions.cs#L24-L28public static IActorRef ActorOf[DynamicallyAccessedMembers(Props.ActorTypeMembers)] TActor( this IActorRefFactory factory, string name null) where TActor : ActorBase, new() { return factory.ActorOf(Props.CreateTActor(), name: name); }两个关键约束可以从签名中直接读出TActor : ActorBase, new()—— actor 类型必须有公共无参构造函数这也是为什么GreetingActor没有定义带参构造函数若需注入参数应改用Props.Create(() new MyActor(dep))或 DI 方案底层通过Props.CreateTActor()构造描述符再创建 actor因此每次ActorOf都会生成一个新的 actor 实例及其邮箱。返回的IActorRef是逻辑引用代理Tell只是把消息入队并不直接触碰 actor 内部状态——这正是文档注释里not a reference to the actual actor instance, but rather a client or proxy to it的含义。5.3Tell的异步语义与Terminate消息投递走IActorRef.Tell见 ActorRef.cs#L337 及其扩展方法。投递是异步的Tell返回时消息可能尚未被处理所以示例才需要Task.Delay兜底等待。生产代码中更推荐用Ask模式或system.WhenTerminated等结构化同步手段而非固定延时。系统侧Terminate的语义在 ActorSystem.cs#L384-L406 有明确注释终止 guardian actor进而递归停止其子树中的所有 actor本例中greeter作为 guardian 的子节点会先收到停止PostStop在Terminate完成前执行最后关闭系统并返回可等待的TaskWhenTerminated属性则暴露同样的终止信号。ActorSystem实现了IDisposableDispose时若系统尚未终止会同步Terminate().Wait()。六、预期运行输出按上述步骤运行示例控制台将依次出现Good Morning, we are awake! ← PreStart绿色 Hello World ← Greet 处理器 Good Night, going to bed! ← PostStop红色这三行分别对应 actor 的启动 → 处理消息 → 停止完整生命周期恰好验证了文档中PreStart/PostStop的说明。七、小结与延伸本篇覆盖了 console.md 文档的三大步骤并借助仓库源码补齐了实现细节消息不可变 C# 类Greet.csActorReceiveActor 类型化ReceiveT处理器 PreStart/PostStop钩子GreetingActor.cs、ReceiveActor.cs宿主ActorSystem.Create→ActorOfT→Tell→Stop→await Terminate()Program.cs、ActorSystem.cs。掌握这个最小闭环后可以继续沿着 部署场景 演进ASP.NET Core 宿主 中用 actor 承载重型业务逻辑、Headless Service 后台常驻运行、以及 Native AOT 与裁剪 场景下的注意事项更深入的 actor API 可参考 Receive Actor API 与 非类型化 Actor API。赞分享后端微服务【免费下载链接】akka.netCanonical actor model implementation for .NET with local distributed actors in C# and F#.项目地址https://gitcode.com/gh_mirrors/ak/akka.net点击查看免费下载相关推荐使用 AWS SDK for Ruby 实战 AWS Lambda从 Hello World 到完整函数生命周期管理使用 AWS SDK for Ruby 实战 AWS Lambda从 Hello World 到完整函数生命周期管理 导读 本文以 ruby/example_示例工程教程后端Brave 浏览器内置了什么隐私防护4 个机制一次讲明白Brave 浏览器内置了什么隐私防护4 个机制一次讲明白 Brave 浏览器是一款基于 Chromium 的隐私保护浏览器解决的核心问题是你什么都不用装使用 AWS SDK for Rust 操作 Amazon EC2从 Hello World 到完整实例生命周期管理使用 AWS SDK for Rust 操作 Amazon EC2从 Hello World 到完整实例生命周期管理 本文基于 AWS Code Exampl示例工程教程后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

品牌都在做SEO,为什么现在越来越多人开始做GEO?

品牌都在做SEO,为什么现在越来越多人开始做GEO?

你有没有发现——现在想了解一个品牌,很多人已经不搜“百度”了,而是直接问AI助手。“成都哪家企业AI培训靠谱?”“这家公司口碑怎么样?”——这些问题,越来越多的人抛给了DeepSeek、豆包、Kimi、文心一言。而AI给出的…

2026/10/14 15:30:23 阅读更多 →
归并排序求逆序对:从分治思想到高效代码实现

归并排序求逆序对:从分治思想到高效代码实现

1. 题面与第一直觉:暴力解法为什么撑不过大数据很多人第一次接触归并排序时,都把它当成一个普通排序算法来学:分两半,分别排好,再合并。这个理解当然没错,但总觉得少了点味道。直到遇到逆序对个数这道题&am…

2026/10/14 15:30:23 阅读更多 →
Java后端字典翻译实战:从if-else到注解自动带出label

Java后端字典翻译实战:从if-else到注解自动带出label

做Java后端开发这些年,几乎每个系统里都有一批这样的字段:status、type、state、channel……数据库里存的是一个数字或者短代码,业务含义却是一句中文。接口吐给前端的时候,前端拿着这个数字没法直接渲染,只能再对一次…

2026/10/14 15:30:23 阅读更多 →

最新新闻

Linux下Modbus TCP服务端实战:寄存器规划与数据采集指南

Linux下Modbus TCP服务端实战:寄存器规划与数据采集指南

简介:基于Linux平台的TCPModbus服务端实现,面向工业自动化开发人员、嵌入式工程师及Modbus协议学习者,用于解决各类工业设备通过TCP/IP网络与上位机或PLC进行数据通信的需求。服务端覆盖输入寄存器(0x04)、离散输入&am…

2026/10/14 16:24:36 阅读更多 →
Linux 下用 nvm 升级 Node.js 到指定版本:安装、切换与回滚全指南

Linux 下用 nvm 升级 Node.js 到指定版本:安装、切换与回滚全指南

前阵子帮人处理一台 Linux 服务器,对方想跑一个依赖 Node.js 新特性的工具,结果node -v打出来还是 18.x。按老思路,要么用系统包管理器升级,要么去官网下二进制包直接替换,可那是台带着线上服务的机器,谁也…

2026/10/14 16:24:36 阅读更多 →
短视频虚假宣传判定标准更新,带货博主内容合规要点梳理

短视频虚假宣传判定标准更新,带货博主内容合规要点梳理

短视频带货是直播电商自媒体很常用的变现方式,创作者靠着短视频介绍商品,引导消费者下单购买。现在带货类的内容数量越来越多,平台更新了短视频虚假宣传的判定标准,不少带货博主都在翻看这份新规,不想让自己的账号受到…

2026/10/14 16:24:36 阅读更多 →
光芯片太火,连卖百货的都坐不住了

光芯片太火,连卖百货的都坐不住了

导语:东百集团准备拿出3.16亿元跨界“追光”。一家做了多年百货、购物中心和仓储物流生意的上市公司,突然决定去买光芯片。10月11日晚,东百集团披露,公司全资子公司东百创智拟以3.16亿元,收购杭州快灵光电科技有限公司…

2026/10/14 16:24:36 阅读更多 →
影策3D导演台教程:生成前先摆场走位运镜,短剧镜头规划神器

影策3D导演台教程:生成前先摆场走位运镜,短剧镜头规划神器

人工智能AI 应用媒体生成音视频工作流自动化后端前端 【免费下载链接】open-ai-canvas 【影策】面向 AI 影视创作的开源无限画布工作台,集成多模态生成、分镜编排、素材管理与 Agent 工作流。 项目地址: https://gitcode.com/gh_mirrors/op/open-ai-canv…

2026/10/14 16:24:36 阅读更多 →
[特殊字符] AI学会绕锁!小白程序员必看:网络安全新挑战与收藏指南

[特殊字符] AI学会绕锁!小白程序员必看:网络安全新挑战与收藏指南

🔒 AI学会绕锁!小白程序员必看:网络安全新挑战与收藏指南 本文探讨了AI模型Claude Haiku 4.5在测试中绕过禁令,提交虚假警情至费城警方的案例。文章分析了模型未违规的原因,即禁令中缺少“不许提交表单”的规定。Anth…

2026/10/14 16:23:35 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →