Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何动态更改事件处理程序回调_C#_.net_Delegates_Callback_Serial Port - Fatal编程技术网

C# 如何动态更改事件处理程序回调

C# 如何动态更改事件处理程序回调,c#,.net,delegates,callback,serial-port,C#,.net,Delegates,Callback,Serial Port,我有一个串口通信类,其中包含以下代码(除其他代码外,仅显示相关部分): 我从我的主窗体实例化这个类,它的地址存储在m_parent中。主窗体有一个名为ProcessPacket的方法,该方法处理传入的数据包。到目前为止还不错 现在,我想处理2个串行端口,所以我需要这个类的2个实例。但是,我不希望它们使用可能导致数据包冲突的相同ProcessPacket方法。我想修改串口通信类,以便在构造函数或getsets中动态设置回调方法,以便实例#1调用m#u parentProcessPacket_A,实

我有一个串口通信类,其中包含以下代码(除其他代码外,仅显示相关部分):

我从我的主窗体实例化这个类,它的地址存储在m_parent中。主窗体有一个名为ProcessPacket的方法,该方法处理传入的数据包。到目前为止还不错

现在,我想处理2个串行端口,所以我需要这个类的2个实例。但是,我不希望它们使用可能导致数据包冲突的相同ProcessPacket方法。我想修改串口通信类,以便在构造函数或getsets中动态设置回调方法,以便实例#1调用m#u parentProcessPacket_A,实例#2调用m#u parentProcessPacket_B。不幸的是,这似乎超出了我的.NET技能范围,因此任何帮助都将是非常好的!
谢谢大家!

您可以在构造函数中定义一个变量并使用它

if(condition)
   handler =  comPort_DataReceived;
else
   handler =  comPort_SomeElseMethod;
然后把这个绑起来

comPort.DataReceived += handler

您可以在构造函数中定义一个变量并使用它

if(condition)
   handler =  comPort_DataReceived;
else
   handler =  comPort_SomeElseMethod;
然后把这个绑起来

comPort.DataReceived += handler

有这样一个构造函数:

YourClass(ProcessPacketDelegate process_packet)
{
    // ...
    this.process_packet = process_packet;
}
在你们班上,还应:

ProcessPacketDelegate process_packet;
然后在您的
comPort\u DataReceived
do中:

m_parent.Invoke(this.process_packet, comBuffer);
在主窗体中,当实例化类时,请执行以下操作:

instance1 = new YourClass(new ProcessPacketDelegate(this.ProcessPacket_A));
instance2 = new YourClass(new ProcessPacketDelegate(this.ProcessPacket_B));

有这样一个构造函数:

YourClass(ProcessPacketDelegate process_packet)
{
    // ...
    this.process_packet = process_packet;
}
在你们班上,还应:

ProcessPacketDelegate process_packet;
然后在您的
comPort\u DataReceived
do中:

m_parent.Invoke(this.process_packet, comBuffer);
在主窗体中,当实例化类时,请执行以下操作:

instance1 = new YourClass(new ProcessPacketDelegate(this.ProcessPacket_A));
instance2 = new YourClass(new ProcessPacketDelegate(this.ProcessPacket_B));

非常感谢。不是我想要的,而是一个很好的解决方法。谢谢!这不是我想要的,而是一个很好的解决方法。非常感谢!我按照您建议的方式修改了我的类,但仍然停留在主窗体上,因为在Intellisense下面的行中发现了一个错误,如:“字段初始值设定项无法引用非静态字段,方法…”instance1=new YourClass(new ProcessPacketDelegate(ProcessPacket_A));试图将“public delegate void ProcessPacketDelegate(字节[]数据包);”上面的线没用,谢谢!我按照您建议的方式修改了我的类,但仍然停留在主窗体上,因为在Intellisense下面的行中发现了一个错误,如:“字段初始值设定项无法引用非静态字段,方法…”instance1=new YourClass(new ProcessPacketDelegate(ProcessPacket_A));试图将“public delegate void ProcessPacketDelegate(字节[]数据包);”行,但无效。两个串行端口==两个DataReceived事件。只需将公共代码移到私有助手方法中。顺便说一句,不要在数据读取方法中调用DiscardInBuffer(),这只会导致无法诊断的数据丢失。您的意思是DiscardInBuffer可以在上一个代码行comPort.Read(…)尚未完成时刷新缓冲区吗?驱动程序从事件处理程序异步运行。您将丢弃读取调用后纳秒内接收到的字节。两个串行端口==两个DataReceived事件。只需将公共代码移到私有助手方法中。顺便说一句,不要在数据读取方法中调用DiscardInBuffer(),这只会导致无法诊断的数据丢失。您的意思是DiscardInBuffer可以在上一个代码行comPort.Read(…)尚未完成时刷新缓冲区吗?驱动程序从事件处理程序异步运行。您将丢弃读取调用后一纳秒收到的字节。