我试图在 C# 中实现生产者/消费者模式。我有一个监控共享队列的消费者线程,以及一个将项目放入共享队列的生产者线程。生产者线程被订阅以接收数据……也就是说,它有一个事件处理程序,只是等待 OnData 事件触发(数据是从第 3 方 api 发送的)。当它获取数据时,它会将它放在队列中,以便消费者可以处理它。
当 OnData 事件确实在生产者中触发时,我曾期望它由我的生产者线程处理。但这似乎不是正在发生的事情。 OnData 事件似乎是在新线程上处理的! .net 总是这样工作的吗...事件在它们自己的线程上处理?我可以控制哪个线程将在引发事件时处理事件吗?如果近乎同时引发数百个事件会怎样...每个事件都有自己的线程吗?
最佳答案
重新阅读问题后,我想我现在明白了问题所在。你基本上得到了这样的东西:
class Producer
{
public Producer(ExternalSource src)
{
src.OnData += externalSource_OnData;
}
private void externalSource_OnData(object sender, ExternalSourceDataEventArgs e)
{
// put e.Data onto the queue
}
}
然后您有一个消费者线程,可以从该队列中提取内容。问题是 OnData 事件是由您的 ExternalSource
对象触发的 - 在它恰好运行的任何线程上。
C# event
基本上只是一个易于使用的委托(delegate)集合,“触发”一个事件只会导致运行时遍历所有委托(delegate)并一次触发一个。
所以您的 OnData 事件处理程序会在 ExternalSource
运行的任何线程上被调用。
关于c# - 在 .NET 中,事件将在哪个线程中处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2459634/