c# - 在 .NET 中,事件将在哪个线程中处理?

标签 c# .net events multithreading delegates

我试图在 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/

相关文章:

c# - 有人大量使用 StreamInsight 吗?

c# - FtpWebRequest FTP 下载与 ProgressBar

.NET 5.0 上 Outlook Automation 的 C# Marshal.GetActiveObject() 替代方案

c# - Shopify C# HMAC SHA256 OAuth 验证

c# - 在c#中生成8位唯一id

c# - 关闭时发送到托盘

c# - 通过C#检测耳机是否插入

javascript - 委托(delegate)事件触发,即使它不应该触发

c# - 在 C# 中从 javascript 生成 html 编码

c++ - SDL_event 列表变得又长又乱?