C#事件未引发,线程

C#事件未引发,线程,c#,multithreading,events,C#,Multithreading,Events,我在一件事上遇到了一些麻烦。问题是,有时事件只是没有被提出 我们从一家公司得到了一台摄像机,我们在软件中实现了它。在该软件中,我们注册了一个事件,每次在相机上拍摄图像时都会触发该事件 我注意到,随着处理能力需求的增加(例如,计算图像的平均值和处理更大的图像),有时会导致事件不会发生。此外,我可以通过增加相机的帧速率使这种情况更频繁地发生。我知道缺少一个框架,因为它们标有ID 在他们自己的演示软件中,我能够以相同的速度运行,没有任何问题。他们的软件不执行任何计算或任何事情,它只是接收并显示图像 我

我在一件事上遇到了一些麻烦。问题是,有时事件只是没有被提出

我们从一家公司得到了一台摄像机,我们在软件中实现了它。在该软件中,我们注册了一个事件,每次在相机上拍摄图像时都会触发该事件

我注意到,随着处理能力需求的增加(例如,计算图像的平均值和处理更大的图像),有时会导致事件不会发生。此外,我可以通过增加相机的帧速率使这种情况更频繁地发生。我知道缺少一个框架,因为它们标有ID

在他们自己的演示软件中,我能够以相同的速度运行,没有任何问题。他们的软件不执行任何计算或任何事情,它只是接收并显示图像

我很困惑,因为这是我拥有的最接近相机的连接;我所能做的就是等待事件的发生。我想问你,你是否知道任何情况下,一个事件会被忽略

对我来说,它看起来像是相机正在发射一个图像,但由于某种原因,甚至没有接收(过载?)

以下是一些相关代码:

private void Camera_OnFrameReceived(AVT.VmbAPINET.Frame frame)
{
    if (frame.ReceiveStatus == VmbFrameStatusType.VmbFrameStatusComplete)
    {
        if (lastID != 0 && lastID != 1)
        {
            if(frame.FrameID - lastID > 1)
                Debug.WriteLine("HEEEEYYY SKIPPED A FRAME, ID: " + frame.FrameID.ToString() + " TOTAL LOST: " + (frame.FrameID - lastID - 1).ToString());
        }
        lastID = frame.FrameID;
        //Debug.WriteLine("Frame received from camera");

        //if the camera is in single mode, dont raise the event (frame already taken)
        if (Mode == CaptureMode.Single)
            return;

        //set the last frame
        _frameQueue.Enqueue(frame);

        if (FilmFrameReady != null)
        {
            DateTime dateTime = Accurate.DtNow;
            frameTaken = false;
            FilmFrameReady(this, new FilmFrameReadyArgs(this, dateTime));
        }
    }
}
正如您所看到的,我获取帧,将其添加到队列中,然后告诉我的外部类,有一些东西可以让它们获取。我正在尽快释放事件线程

摘要:

我的事件有时不被提起。我想这是因为主线程工作太努力了


您是否有过有时不会引发事件的经验?

很可能在触发事件的代码能够触发更多事件之前,所有事件处理程序都需要完成;它可能只有一个线程来触发事件。当它在当前事件完成之前有一个新事件要触发时,它可以跳过触发该事件(这似乎是它所做的),或者将其排队等待以后。如果它执行后一种操作,那么如果事件处理程序几乎总是花费比事件触发之间的时间更长的时间,那么它就有远远落后的风险。落后意味着消耗的内存量越来越大,同时也意味着因为很久以前发生的事情而触发事件,这(在某些情况下)可能是一个问题

您可以通过使用一个事件处理程序来解决这个问题,该事件处理程序实际上并不执行该工作,而是将信息放入一个队列(这里最好使用
BlockingCollection
),以便另一个线程(或多个线程,如果您可以安全地并行处理)可以处理这些项目。但是要小心,除非您只是偶尔花“太长”的时间来处理事件,否则最终可能会出现一个不断增长的队列,或者会让您的机器充斥着超出其处理能力的线程。如果您只是偶尔花“太长时间”,那么这将有助于在不创建积压的情况下平衡它


最后,如果处理时间太长,您可能别无选择,只能专注于提高事件处理程序的性能,使其所需时间(平均)低于帧速率,或者将帧速率限制在处理所能处理的范围内。

这听起来像是您使用的第三方库的问题&而不是您的代码。然而,如果你能展示一些代码,这将是一个开始…我想也是这样,直到我开始他们的演示程序,它工作得很好。我包括了一些代码对不起,我应该包括一些代码。正如你在我编辑的问题中所看到的,我正在尽快发布帖子。不过你似乎仍然是对的。在每次错过帧之前,函数需要0.2-0.3秒的时间来完成,而不是正常的0.032-0.003秒。我猜这与我从未包含在编辑代码“Camera.QueueFrame(frame);”中的一个部分有关,在该代码中,我再次将收到的帧添加到相机队列中。不过我得检查一下。