C# 事件和线程

C# 事件和线程,c#,.net,multithreading,events,event-handling,C#,.net,Multithreading,Events,Event Handling,假设我有: ethernet_adapter.PacketArrived += (s, e) => { //long processing... }; 处理可能需要很长的时间,而在中间,另一个数据包已经到达。接下来会发生什么:处理完成,然后触发另一个事件,或者可能会立即在新线程上触发新事件?很可能这是一个同步操作。在另一个线程上发生事件的唯一方式是引发事件的对象在另一个线程上发生事件,或者在处理程序中发生事件。有很多方法可以做到这一点,但如果使用.NET4,通常会首选使用 仔细

假设我有:

ethernet_adapter.PacketArrived += (s, e) => 
{
    //long processing...
};

处理可能需要很长的时间,而在中间,另一个数据包已经到达。接下来会发生什么:处理完成,然后触发另一个事件,或者可能会立即在新线程上触发新事件?

很可能这是一个同步操作。在另一个线程上发生事件的唯一方式是引发事件的对象在另一个线程上发生事件,或者在处理程序中发生事件。有很多方法可以做到这一点,但如果使用.NET4,通常会首选使用


仔细考虑您希望应用程序如何运行。在一个新线程上简单地处理每个数据包可能会导致数据包被无序处理。您可能希望将它们排队,并让后台线程在此时处理它们。或者您可能根本不需要执行任何操作。

您可以在ThreadPool中将整个任务排队,如下所示

ethernet_adapter.PacketArrived += (s, e) => 
{
ThreadPool.QueueUserWorkItem("long processing item");
};

或者您可以为每个线程创建任务(.net 4.0)。

您不应该假设。它可以是任何东西,这取决于事件是如何按类型(以太网适配器的
对象)引发的

如果是同步操作,则在当前操作进行之前不会引发新事件


如果是异步操作,则会立即引发新事件。

假定在您的
以太网适配器
类中有一个方法:

protected virtual void OnPacketArrived(PacketArrivedEventArgs e)
{
    EventHandler<PacketArrivedEventArgs> handler = this.PacketArrived;

    if (handler != null)
    {
        handler(this, e);
    }
}
PacketArrived上受保护的虚拟无效(PacketArrivedEventArgs e)
{
EventHandler=this.PacketArrived;
if(处理程序!=null)
{
处理者(本,e);
}
}
长时间处理同步订阅服务器(如示例中所示)将阻止所有订阅服务器的内部枚举。但是如果
ethernet\u adapter
每次在不同的线程上调用它,它可能不会阻止对
OnPacketArrived
的后续调用,因此您将得到两个并发长处理,依此类推


例如,,看看
Socket
实现:它的异步方法导致在IOCP线程上调用完成回调-每次都不同,而IO
ThreadPool中有任何对象
ethernet\u适配器是什么类型的?@JimMischel它是第三方库类型
ICaptureDevice
。我想我得到了答案。这与OP问题有什么关系?每个长处理项都可以在线程池中排队,并相应地得到服务。我希望我已经理解了这个问题。我想,问题是“行为是什么”,而不是“如何进行异步处理”