我有一个使用 UDP 与硬件设备通信的库。对话是这样的:
|------------000E------------>|
| |
|<-----------000F-------------|
| |
|------------DC23------------>|
| |
|<-----------DC24-------------|
首先,我发送操作码 000E 并期望得到 000F 作为响应。一旦我得到 000F,我会发送一个 DC23 并期待一个 DC24 作为响应。(响应中包含附加信息以及操作码。)将来,可能需要在此对话中添加更多步骤。
负责与设备通信的对象有如下接口:
public class Communication : ICommunication
{
public Communication();
public bool Send_LAN(byte subnetID, byte deviceID, int operateCode, ref byte[] addtional);
public event DataArrivalHandler DataArrival;
public delegate void DataArrivalHandler(byte subnetID, byte deviceID, int deviceType, int operateCode, int lengthOfAddtional, ref byte[] addtional);
}
当我尝试天真地编写此代码时,我最终switch
会在事件处理程序中得到一条语句,该语句DataArrival
根据响应代码执行不同的操作,如下所示:
private void _com_DataArrival(byte subnetID, byte deviceID, int deviceTypeCode, int operateCode, int lengthOfAddtional, ref byte[] addtional)
{
Debug.WriteLine($"OpCode: 0x{operateCode:X4}");
switch (operateCode)
{
case 0x000F: // Response to scan
// Process the response...
_com.Send_LAN(subnet, device, 0xDC23, ...);
break;
case 0xDC24:
// Continue processing...
break;
}
}
它开始看起来像是要变成状态机了。我认为必须有更好的方法来使用TaskCompletionSource
and async/await
。
我该怎么做呢?