C# MultisourceFrameArrized-=不工作。如何禁用它?

C# MultisourceFrameArrized-=不工作。如何禁用它?,c#,kinect,kinect-v2,C#,Kinect,Kinect V2,我正在从事Kinect项目。我正在记录接收到的帧的数据。当我必须处理帧数据时,程序占用了很多时间。同时,我想禁用EventHandler MultiSourceFrameArrived 问题是,我一直在读不同的帖子,我找不到适合我问题的答案。表达式-=似乎只有在与表达式+=在同一范围内时才起作用。当我在不同的作用域中写入它们时,帧仍在到达,我无法禁用该事件处理程序 非工作代码如下所示: private void MainWindow() { //Intitalize components

我正在从事Kinect项目。我正在记录接收到的帧的数据。当我必须处理帧数据时,程序占用了很多时间。同时,我想禁用EventHandler MultiSourceFrameArrived

问题是,我一直在读不同的帖子,我找不到适合我问题的答案。表达式
-=
似乎只有在与表达式
+=
在同一范围内时才起作用。当我在不同的作用域中写入它们时,帧仍在到达,我无法禁用该事件处理程序

非工作代码如下所示:

private void MainWindow()
{
    //Intitalize components
    if (this.multiSourceFrameReader != null)
    {
        EnableFrameArrived();        
    }
}

private void MultiSourceFrameReader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
     DisableFrameArrived();
}

private void DisableFrameArrived()
{
    this.multiSourceFrameReader.MultiSourceFrameArrived -= this.MultiSourceFrameReader_MultiSourceFrameArrived;
//This doesn`t cancel my suscription to the event.
}

private void EnableFrameArrived()
{
    this.multiSourceFrameReader.MultiSourceFrameArrived += MultiSourceFrameReader_MultiSourceFrameArrived;
}
private void MainWindow()
{
    //Intitalize components
    if (this.multiSourceFrameReader != null)
    {
        this.multiSourceFrameReader.MultiSourceFrameArrived += this.MultiSourceFrameReader_MultiSourceFrameArrived; 
        //I subscribe to the event
    }
    this.multiSourceFrameReader.MultiSourceFrameArrived -= this.MultiSourceFrameReader_MultiSourceFrameArrived;
    //I cancel my subscription. But I need to cancel my subscription in another scope. 
}
工作代码如下:

private void MainWindow()
{
    //Intitalize components
    if (this.multiSourceFrameReader != null)
    {
        EnableFrameArrived();        
    }
}

private void MultiSourceFrameReader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
     DisableFrameArrived();
}

private void DisableFrameArrived()
{
    this.multiSourceFrameReader.MultiSourceFrameArrived -= this.MultiSourceFrameReader_MultiSourceFrameArrived;
//This doesn`t cancel my suscription to the event.
}

private void EnableFrameArrived()
{
    this.multiSourceFrameReader.MultiSourceFrameArrived += MultiSourceFrameReader_MultiSourceFrameArrived;
}
private void MainWindow()
{
    //Intitalize components
    if (this.multiSourceFrameReader != null)
    {
        this.multiSourceFrameReader.MultiSourceFrameArrived += this.MultiSourceFrameReader_MultiSourceFrameArrived; 
        //I subscribe to the event
    }
    this.multiSourceFrameReader.MultiSourceFrameArrived -= this.MultiSourceFrameReader_MultiSourceFrameArrived;
    //I cancel my subscription. But I need to cancel my subscription in another scope. 
}
我对代码的其余部分进行了注释,只是让这部分继续运行。即使达到禁用方法,我仍会继续输入帧。为什么只有我在同一范围内才能取消我的活动?我读过不同的博客,但我不能解决这个问题

有什么建议吗?
谢谢

调用了多少次
enableframearived()
&&flag
不是线程安全的(尽管它可能只在UI线程上运行)。在这段代码中只有一次。在
MainWindows中加载()。我的主要想法是在完成处理后再次调用它,但我无法使DisableFrameArrized()工作,因为帧仍在到达。我询问了国旗的情况,以检查它是否是第一次被呼叫。好吧,谢谢托马斯的回答。我检查了你的意思,然后我修改了密码。我将
enableframearived()
放在
main window()
函数中。当
this.multiSourceFrameReader.multisourceframearrized+=this.multiSourceFrameReader\u multisourceframearrized
this.multiSourceFrameReader.multisourceframearrized-=this.multiSourceFrameReader\u multisourceframearrized在同一范围内时它们工作得很好。但是,当它们不在同一范围内时,禁用方法
-=
不起作用。我认为lambda调用有问题,但我不知道如何解决。你说问题在于“lambda调用”,但你的程序片段中没有lambda。如果您的事件处理程序是lambda而不是方法组,那么您确实会遇到这个问题。您能显示出现问题的实际代码吗?