<aside>
🎯 In three lines — ① The actor model got its name in 1973 from Carl Hewitt's formalism for AI research, and Erlang (1986) — whose designers had never heard of that theory — proved the same idea in production. From there it ran through Akka (2009) → Orleans and Akka.NET (2014–2015) → Ray, Swift and Dapr: fifty years of proven concurrency. It is no longer a sensation; it is boring technology — and in engineering culture, that is a compliment. ② An actor is "an object with state + a mailbox + one letter at a time." Instead of taking a lock, you queue messages; instead of adding more try/catch, a supervisor restarts what failed. ③ AgentZero Lite (.NET 10 · WPF · Akka.NET 1.5) builds terminals, an AI agent, a voice pipeline and multi-agent orchestration on top of this boring technology, and runs an on-device LLM (Gemma 4 GGUF via LLamaSharp) as an agent loop inside an actor.
</aside>
<aside>
👤 Who this is for — developers who know C#/.NET well but have never used actors. If you have written async/await, lock, Task and Dispatcher.Invoke but Tell, Become and Supervision are new to you, this is written for you. Chapters 1–4 cover actors in general (readable without code); chapters 5–8 take a real project apart. Code samples are kept to the minimum needed to make a point.
</aside>
<aside>
📌 As of 2026-10-02. The subject is Project/AgentZeroWpf + Project/ZeroCommon in psmon/AgentZeroLite (commit a63f553, v0.25.1). Runtime: .NET 10, Akka/Akka.Streams 1.5.67 (the latest stable release as of 2026-08-26 is 1.5.71). All external sources were checked on 2026-10-02. Vendor and secondary sources are marked as such in the text.
</aside>
<aside> 🌏 한국어판 — 지루해서 믿을 수 있다 — 닷넷 개발자를 위한 액터 모델 50년 계보와 AgentZero Lite 해부
</aside>
If you write .NET, you have probably met code like this.
private readonly object _gate = new();
private int _pending;
void OnOutput(string text) // called on the PTY thread
{
lock (_gate) { _buffer.Append(text); _pending++; }
Application.Current.Dispatcher.Invoke(() => Render()); // hop to the UI thread
}
It works at first. Then you have ten terminal tabs, an LLM streaming tokens in the background, live speech recognition from the microphone, and other AI CLIs sending results back — and now you have to keep the number and order of every lock in your head. Deadlocks refuse to reproduce, and one exception on the wrong thread takes the whole app down.
The actor model has given the same answer to this problem for fifty years: "Don't share — send. And when something dies, start it again."
<aside> 💬 "Good technology is technology that no longer has issues." — Boring doesn't mean bad. It means there are fewer surprises left.
</aside>
There is a clear starting point for why boring became a compliment in the developer community. On 30 March 2015, Dan McKinley — one of Etsy's early engineers — published “Choose Boring Technology” on his blog. Through his OSCON 2015 talk (by then he was at Stripe) and the slide edition at boringtechnology.club, the phrase became shared vocabulary.
By boring, McKinley means "its capabilities are well understood — and, more importantly, so are its failure modes." Drawing on his experience at Etsy, where experimental stacks bolted onto PHP were later torn out in favour of something more predictable, he argues that every company gets only about three innovation tokens. Spend them on your core business problem; fill the rest with boring technology.
The actor model is something you do not need to spend a token on. The theory appeared in 1973; it has run telephone switches since 1986. There are no surprises left — and that is exactly why this article calls actors "boring."
Yet in 2024–2026 this boring technology is being laid down again under the hottest topic of all: AI agents. Microsoft AutoGen 0.4 said outright that it embraces the actor model, and in July 2025 Akka launched its Agentic AI Platform. This article first walks the lineage to explain why, then opens a real .NET desktop app to show how actors and agents fit together.
An actor — a unit of computation that owns its state alone and talks only through messages — can do exactly three things each time it receives a message: