Рейтинг:
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,когда я отлаживаю код