Работы с событиями

175
09 февраля 2018, 17:52

В своей программе, для упрощения кода, создал класс, куда запихнул все однотипные функции. Так вот, в этом классе есть свои объекты, у которых есть события. И мне необходимо передавать какую-то информацию, из этих событий в основную программу. Как с этим быть? Раньше просто всё было в основной программе и я использовал глобальные переменные, или вызывал функции в этих событиях. А когда всё это отдельно. Скорее всего, нужно создать событие в основной программе, которое я буду вызывать, когда будет вызываться событие в классе и передавать в основную программу во входных данных всю нужную информацию. Но как это реализовать в коде? Заранее спасибо.

Например :

        publisherMove = new Publisher(conn, "p2mq://FORTS_SRV;category=FORTS_MSG;name=srvlinkMove;timeout=5000;scheme=|FILE|forts_messages.ini|message");
        listenerSendMove = new Listener(conn, "p2mqreply://;ref=srvlinkMove");
        listenerSendMove.Handler += new Listener.MessageHandler(ClientMessageCallbackMove);
       public static int ClientMessageCallbackMove(Connection conn, Listener listener, Message msg)
    {
        try
        {
            if (msg.Type == MessageType.MsgData)
            {
                DataMessage replmsg = (DataMessage)msg;
                //Здесь нужно передать в основную программу replmsg
                Console.WriteLine(String.Format("Client received reply [id: {0}, data: {1}, user-id: {2}, name: {3}]", ((DataMessage)msg).MsgId, ((DataMessage)msg).Data, ((DataMessage)msg).UserId, ((DataMessage)msg).MsgName));
                {
                    System.Console.WriteLine("client dump: {0}", msg);
                }
            }
            else if (msg.Type == MessageType.MsgP2MQTimeout)
            {
                Console.WriteLine("Client reply TIMEOUT");
            }
            else
            {
                Console.WriteLine(String.Format("Message {0}", msg.Type));
            }
            return 0;
        }
        catch (CGateException e)
        {
            return (int)e.ErrCode;
        }
    }

Этот код в классе, мне не нужно полностью подписаться на это событие, мне нужно лишь от туда достать replmsg при его вызове.

Answer 1

Так, если listenerSendMove - публичный объект, тогда возьмите и подпишитесь так же из вне вашего класса:

listenerSendMove.Handler += new  Listener.MessageHandler(AnotherClientMessageCallbackMove);
public static void ClientMessageCallbackMove(Connection conn, Listener listener, Message msg)
{
            DataMessage replmsg = (DataMessage)msg; //и делайте с ним что хотите
}

В чем проблема то я не пойму?

READ ALSO
Automapper exception: needs to have a constructor with 0 args or only optional args

Automapper exception: needs to have a constructor with 0 args or only optional args

Добрый деньС помощью automapper пытался проецировать функции разных типов моделей

416
Создание dll с внешними библиотеками

Создание dll с внешними библиотеками

Есть 10 внешних библиотек, которые я подключаю к своему классуМожно ли как-нибудь сделать, чтобы при компиляции у меня получился 1 общий dll

226
Автоматизированное обновление службы windows на C#

Автоматизированное обновление службы windows на C#

Есть служба windows, написанная на c#Сейчас при каждом изменении приходится останавливать службу на удаленном сервере, копировать руками все...

160
Нахождение одностороннего ряда

Нахождение одностороннего ряда

Есть двумерный массив чаровМне надо найти в этом массиве определенные получившиеся "слова" в процессе

233