共计 1894 个字符,预计需要花费 5 分钟才能阅读完成。
什么是 C# Agent?
C# Agent 是一种基于消息传递的并发模型,它封装了状态和行为,通过异步消息与其他组件交互。简单说,就像一个有独立思考和行动能力的虚拟对象。典型应用包括:

- 后台任务调度(定时爬虫、文件处理)
- 游戏中的 NPC 行为控制
- IoT 设备的状态监控
开发环境准备
- 运行时 :.NET 6+(推荐 .NET 8)
- IDE:Visual Studio 2022 或 JetBrains Rider
- NuGet 包 :
Microsoft.Orleans.Core(轻量级框架)System.Threading.Channels(消息管道)
第一个 Agent 实现
基础结构代码
public class FileProcessorAgent : IDisposable
{
// 状态变量
private int _processedFiles;
private readonly Channel<string> _messageQueue;
public FileProcessorAgent()
{_messageQueue = Channel.CreateUnbounded<string>();
Task.Run(ProcessMessagesAsync); // 启动消息处理循环
}
// 核心消息处理方法
private async Task ProcessMessagesAsync()
{await foreach (var filePath in _messageQueue.Reader.ReadAllAsync())
{
try {var content = await File.ReadAllTextAsync(filePath);
_processedFiles++;
Console.WriteLine($"Processed: {filePath}");
} catch {/* 错误处理 */}
}
}
// 外部调用接口
public void PostFile(string path) =>
_messageQueue.Writer.TryWrite(path);
public void Dispose() => _messageQueue.Writer.Complete();
}
关键点说明:
Channel实现线程安全的异步消息队列ReadAllAsync创建持续监听的消息循环TryWrite提供非阻塞的消息投递接口
进阶技巧
并发消息处理
// 在构造函数中添加
private readonly SemaphoreSlim _semaphore = new(5);
// 修改消息处理循环
await foreach (var msg in _messageQueue.Reader.ReadAllAsync())
{await _semaphore.WaitAsync();
Task.Run(async () => {try { /* 处理逻辑 */}
finally {_semaphore.Release(); }
});
}
状态持久化方案
// 使用 LiteDB 实现
public async Task SaveStateAsync()
{using var db = new LiteDatabase("agent_state.db");
var col = db.GetCollection<AgentState>("states");
await col.UpsertAsync(new AgentState {
Id = 1,
ProcessedCount = _processedFiles
});
}
常见问题避坑
性能陷阱
- 线程阻塞 :避免在消息处理中同步等待 I/O
- 内存泄漏 :及时清理事件订阅和 CancellationTokenSource
设计禁忌
- 不要直接暴露内部状态(违反封装)
- 避免一个 Agent 超过 3 个职责(违反单一职责)
练习项目建议
- 实现带优先级消息队列的 Agent
- 开发自动重试失败任务的机制
- 构建父子 Agent 的监督层级结构
测试你的理解
- 如何实现 Agent 的优雅关闭?
-
提示:结合 CancellationToken 和消息队列完成通知
-
为什么不应该在 Agent 构造函数中启动长时间运行的任务?
-
提示:考虑对象初始化与异常处理的关系
-
设计一个处理电商订单的 Agent 需要哪些核心状态?
- 提示:订单状态机、库存缓存、操作日志
sequenceDiagram
participant Client
participant Agent
Client->>Agent: PostFile("data.txt")
Agent->>Agent: 加入消息队列
loop 消息处理
Agent->>Agent: 从队列读取消息
Agent->>FileSystem: 读取文件
FileSystem-->>Agent: 返回内容
Agent->>Agent: 更新处理计数
end
正文完
