Nishikant Tayade Ответов: 2

Проблема с созданием пользовательского обработчика событий?


Всякий раз,когда данные поступают в буфер, я хочу вызвать событие.

Я попробовал следующую вещь,но она не дает вызова методу обработчика событий.


Вот этот код:

Что я уже пробовал:

public class CurrentDataDataRespParser
   {

       //public Action<byte[]> DataReceived;

       public event EventHandler<byte[]> DataReceived;
       public CurrentDataDataRespParser()
       {

       }

       public int Parse(byte[] pBuffer)
       {
           onDataReceived(pBuffer);
           return pBuffer.Count();
       }

       public virtual void onDataReceived(byte[] pBuffer)
       {
           DataReceivedEventSubscriber subscriber = new DataReceivedEventSubscriber();
           DataReceived?.Invoke(this, pBuffer);
       }

   }



public class DataReceivedEventSubscriber
   {
       public CurrentDataDataRespParser datarespParser;

       public DataReceivedEventSubscriber()
       {
           datarespParser = new CurrentDataDataRespParser();
           datarespParser.DataReceived += DataReceived_PerformOperation;
       }

       public void DataReceived_PerformOperation(Object sender,byte[] pBuffer)
       {
           Console.WriteLine("Event raised,inside event handling method");
       }
   }

2 Ответов

Рейтинг:
16

F-ES Sitecore

Парсер имеет событие (DataReceived), на которое никто не подписан. Единственное, что подписывается на это событие, - это DataReceivedEventSubscriber, но он подписывается на событие экземпляра CurrentDataDataRespParser, который является внутренним для самого себя, поэтому единственное время, когда это событие будет срабатывать, - это если методы вызываются для этого объекта внутри подписчика.

Тебе нужно что-то еще вроде этого;

public class CurrentDataDataRespParser
{
    public event EventHandler<byte[]> DataReceived;
    public CurrentDataDataRespParser()
    {

    }

    public int Parse(byte[] pBuffer)
    {
        onDataReceived(pBuffer);
        return pBuffer.Count();
    }

    public virtual void onDataReceived(byte[] pBuffer)
    {
        DataReceived?.Invoke(this, pBuffer);
    }
}

public class DataReceivedEventSubscriber
{
    public void DataReceived_PerformOperation(Object sender, byte[] pBuffer)
    {
        Console.WriteLine("Event raised,inside event handling method");
    }
}


код вызова;

CurrentDataDataRespParser client = new CurrentDataDataRespParser();
DataReceivedEventSubscriber sub = new DataReceivedEventSubscriber();

client.DataReceived += sub.DataReceived_PerformOperation;

client.Parse(Encoding.ASCII.GetBytes("Hello"));



Это заставляет метод в вашем объекте подписчика подписаться на событие, выставленное объектом синтаксического анализатора.


Nishikant Tayade

Спасибо!Вы правы, и он работает отлично,но проблема в том, что

клиент.Синтаксический Анализ(Кодирование.ASCII.GetBytes("Hello"));//здесь в моем коде я не вызываю напрямую метод parse,есть еще один метод someClass.SendBytes();
который внутренне проходит через множество классов, и один из методов этого класса дает вызов методу Parse.

Когда я снова отлаживаю его, он показывает DataReceived как null.

F-ES Sitecore

Я просто вставил этот код, чтобы проверить, у меня была идея, что ваш фактический код был другим. Концепция, которую, как мне кажется, вы упускаете, заключается в том, что события не являются "глобальными". Если вы не подписываетесь на свойство события, то каждый экземпляр этого класса использует его в качестве обработчика событий. События являются основой класса для каждого экземпляра. Какой бы экземпляр класса ни вызывал обработчик событий, он должен был вызывать "classInstance += eventHandler".

var x1 = новый myClass();
x1.MyEvent += myhandler;
x1.DoSomething(); // myHandler вызывается потому, что у x1 есть подписчик
var x2 = новый myClass();
x2.DoSomething(); // myhandler не вызывается, потому что ничто не подписано на x2

Nishikant Tayade

программа Открытый класс
{
public delegate int MyOwnDelegate(byte[] pBuffer);

публичный статический пустота главный(строка[] аргументы)
{


CurrentDataDataRespParser клиент = новый CurrentDataDataRespParser();
client.testEvent += новая программа.MyOwnDelegate(новая программа().TestMethod);

DOF2.sendBytes();
Приставка.ReadKey();


}

public int TestMethod(byte[] pBuffer)
{
Приставка.WriteLine("внутри метода тестирования");
возвращает 0;
}
}

//CurrentDataDataRespParser-это класс, в котором я объявил событие.

публичный класс CurrentDataDataRespParser
{

публичное мероприятие MyOwnDelegate testEvent;
публичный CurrentDataDataRespParser()
{


}

public int Parse(byte[] pBuffer)
{

тестовое событие?.Invoke(pBuffer); return pBuffer.Рассчитывать();
}


}

//а ниже приведен класс ,из которого будет вызван метод parse, который вызовет событие, то, что я действительно хочу, это выполнить метод TestMethod, написанный в программном классе.


публичный класс CurrentDataPacketRespDecoder:PacketDecoder
{
общественные CurrentDataDataRespParser data_parser_instance;


публичный CurrentDataPacketRespDecoder()
{
data_parser_instance = новый CurrentDataDataRespParser();
}

общественного переопределить недействительными декодирования(байт[] параметр pbuffer, байт[] outBuffer
{
if (data_parser_instance == null) { return; }

**здесь дается вызов метода parse**
инт consumedBytes = data_parser_instance.Синтаксический анализ(параметр pbuffer);


}

Рейтинг:
1

johannesnestler

в принципе, все выглядит хорошо. Итак, ваш абонент все еще жив? Где находится код, когда вы создаете подписчика?

- этот код, конечно, чепуха:

public virtual void onDataReceived(byte[] pBuffer)
{
     DataReceivedEventSubscriber subscriber = new DataReceivedEventSubscriber();
     DataReceived?.Invoke(this, pBuffer);
}



должно быть просто:

public virtual void onDataReceived(byte[] pBuffer)
{
   DataReceived?.Invoke(this, pBuffer);
}


Nishikant Tayade

Я создаю подписчика в основном методе в программе класса.

программа Открытый класс
{

публичный статический пустота главный(строка[] аргументы)
{





DataReceivedEventSubscriber test = новый DataReceivedEventSubscriber ();
DOF2.sendBytes();//этот метод отправляет массив байтов для анализа метода в приведенном выше коде, который вызывает событие.

Приставка.ReadKey();

// порт.Закрывать();
// порт.утилизировать();
}


}
}

//DataReceived показывает null,когда я отлаживаю код