在.NET中,处理事件的线程是什么?

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事件处理程序.

  • @Ben - 您应该将此标记为已接受的答案.这将有助于其他人更容易地看到答案. (19认同)

Ada*_*son 23

除非你自己编组,否则事件将在任何调用它的线程上执行; 调用事件的方式并没有什么特别之处,并且你的生产者线程没有事件处理程序,你的生产者线程简单地说"嘿,当你触发这个事件时,调用这个函数".在那里没有任何东西导致事件执行发生在附加线程上,也没有发生在它自己的线程上(除非你使用BeginInvoke而不是正常调用事件的委托,但这只会在它上面执行ThreadPool).


Kon*_*rin 10

引发事件与Invoke调用方法相同 - 它在您引发它的同一个线程中执行.

提高与事件BeginInvoke的用途ThreadPool.这里有一些小细节