【发布时间】:2012-11-29 20:43:17
【问题描述】:
在 C# 控制台应用程序的上下文中,如果我创建一个用于异步接收消息的循环,它会为收到的每条消息引发一个事件,例如:
while (true)
{
var message = await ReceiveMessageAsync();
ReceivedMessage(new ReceivedMessageEventArgs(message));
}
现在,如果我有多个事件订阅者(举例来说,假设为 3 个订阅者),所有订阅者都使用异步事件处理程序,例如:
async void OnReceivedMessageAsync(object sender, ReceivedMessageEventArgs args)
{
await TreatMessageAsync(args.Message);
}
应该以线程安全的方式对消息对象进行编码吗?我认为是这样,因为来自不同事件处理程序的 TreatMessageAsync 代码可能会为所有订阅者同时运行(当引发事件时,订阅者的三个异步事件处理程序被调用,每个都启动一个异步操作,该操作可能在不同线程上同时运行由任务调度程序)。还是我错了?
谢谢!
【问题讨论】:
-
您在这里没有给我们足够的细节 - 没有迹象表明
TreatMessageAsync是什么,或者事件是什么。如果你能给出一个简短但完整的程序,那会让生活变得简单很多。
标签: c# task-parallel-library async-await