MultiSourceFrameArrived -= не работает. Как я могу отключить его?

Я работаю над проектом Kinect. Я записываю данные из полученных кадров. Когда мне приходится обрабатывать данные кадра, программа занимает много времени. Тем временем я хочу отключить обработчик событий 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. 
}

Я прокомментировал остальную часть кода и просто оставил эту часть работающей. Я продолжаю получать входящие кадры, даже несмотря на то, что метод отключения достигнут. Почему отмена моего мероприятия возможна только в том случае, если я нахожусь в той же области? Я читаю разные блоги, но не могу решить эту проблему.

Какие-либо предложения? Спасибо!


person Magali Sganga    schedule 11.02.2020    source источник
comment
Сколько раз вызывается EnableFrameArrived()? Эта вещь && flag не является потокобезопасной (хотя, вероятно, она должна работать только в потоке пользовательского интерфейса).   -  person Thomas Weller    schedule 11.02.2020
comment
Только один раз в этом коде. В 1_. Моя основная идея состоит в том, чтобы вызвать его снова, когда я закончу обработку, но я не могу заставить DisableFrameArrived() работать, так как кадры все еще поступают. Я спросил о флаге, чтобы проверить, вызывается ли он впервые.   -  person Magali Sganga    schedule 11.02.2020
comment
comment
Спасибо Томас за ваш ответ. Я проверил, что вы имели в виду, и изменил код. Я поместил EnableFrameArrived() в функцию MainWindow(). Когда this.multiSourceFrameReader.MultiSourceFrameArrived += this.MultiSourceFrameReader_MultiSourceFrameArrived находится в той же области, что и this.multiSourceFrameReader.MultiSourceFrameArrived -= this.MultiSourceFrameReader_MultiSourceFrameArrived;, они работают нормально. Но когда они не находятся в одной области, метод отключения -= не работает. Я думаю, что это проблема с лямбда-вызовом, но я не знаю, как ее решить.   -  person Magali Sganga    schedule 12.02.2020
comment
Вы говорите, что проблема в вызове лямбды, но в вашем фрагменте программы лямбда отсутствует. Если ваши обработчики событий представляют собой лямбда-выражения, а не группы методов, вы действительно можете столкнуться с этой проблемой. Можете ли вы показать фактический код, в котором есть проблема?   -  person Eric Lippert    schedule 12.02.2020
comment
Эрик, как ты сказал, у меня нет лямбда-вызовов, я исправляю свой вопрос, когда понял это. Я отредактирую вопрос с кодом, который действительно работает.   -  person Magali Sganga    schedule 12.02.2020