Поднятие события внутри события - PullRequest
0 голосов
/ 09 мая 2018

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

Первое событие здесь прямо взято из API Vimba Camera, который я использую, и оно прекрасно работает. Я прочитал несколько вещей о том, как правильно вызвать событие (, в частности, первый ответ здесь ), но я не могу заставить мое второе событие работать правильно. Я наверное что-то неправильно понял, но что?

Вот версия псевдокода того, что я написал:

public partial class Form1 : Form
{
    public delegate void SecondEventHandler(int[] myData);
    public event SecondEventHandler SomethingHappened;

    //Doing a lot of things irrelevant here

    myObj.OnFirstEvent += new Obj.OnFirstEventHandler(this.OnFirstEvent);

    private void OnFirstEvent(Data data)
    {
        //Doing things, and preparing myData
        SomethingHappened += new SecondEventHandler(HandleSomethingHappened);
    }

    void HandleSomethingHappened(int[] myData)
    {
        //Working with myData
    }
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

На самом деле, самый простой, но самый чистый способ достичь этого, называется продолжением в стиле . OnFirstEvent(Data data) должно стать OnFirstEvent(Data data, Action<int[]> continuator). Всякий раз, когда он не нулевой, ваш код вызывает его.

Однако я предупреждаю вас: не позволяйте этому расти и распространяться по всему вашему коду. Трудно отлаживать и поддерживать в долгосрочной перспективе. Если вы ожидаете, что такой подход будет широко использоваться, взгляните на reactive extensions.

0 голосов
/ 09 мая 2018

Если вы хотите вызвать методы, привязанные ко второму событию:

    private void OnFirstEvent(Data data)
    {
        //Doing things, and preparing myData
        var h = SomethingHappened;
        if(h != null)
            h(pass your int[] parameter)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...