Ben*_*Ben 51 .net c# events multithreading delegates
我试图在c#中实现生产者/消费者模式.我有一个监视共享队列的消费者线程,以及一个将项放入共享队列的生产者线程.生产者线程被订阅接收数据...也就是说,它有一个事件处理程序,只是坐着等待OnData事件触发(数据从第三方api发送).当它获取数据时,它会将其粘贴在队列中,以便消费者可以处理它.
当OnData事件在生产者中触发时,我原本期望它由我的生产者线程处理.但这似乎并不是正在发生的事情.OnData事件看起来好像是在新线程上处理的!这是.net始终如何工作...事件是在自己的线程上处理的?我可以控制什么线程在它们被引发时处理事件?如果几乎同时发生了数百个事件......每个事件都有自己的线程怎么办?
Dea*_*ing 88
重新阅读问题后,我想我现在明白了这个问题.你基本上得到了这样的东西:
class Producer
{
public Producer(ExternalSource src)
{
src.OnData += externalSource_OnData;
}
private void externalSource_OnData(object sender, ExternalSourceDataEventArgs e)
{
// put e.Data onto the queue
}
}
Run Code Online (Sandbox Code Playgroud)
然后你有一个消费者线程可以从那个队列中抽出东西.问题是OnData事件是由你的ExternalSource对象触发的- 在它碰巧运行的任何线程上.
C#events基本上只是一个易于使用的委托集合,"触发"事件只会导致运行时循环遍历所有委托并一次触发它们.
因此,ExternalSource在运行的任何线程上调用OnData事件处理程序.
Ada*_*son 23
除非你自己编组,否则事件将在任何调用它的线程上执行; 调用事件的方式并没有什么特别之处,并且你的生产者线程没有事件处理程序,你的生产者线程简单地说"嘿,当你触发这个事件时,调用这个函数".在那里没有任何东西导致事件执行发生在附加线程上,也没有发生在它自己的线程上(除非你使用BeginInvoke而不是正常调用事件的委托,但这只会在它上面执行ThreadPool).
| 归档时间: |
|
| 查看次数: |
37829 次 |
| 最近记录: |