【发布时间】:2017-07-03 13:46:59
【问题描述】:
我有一个使用 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);
}
当我尝试天真地编写此代码时,我会在 DataArrival 事件处理程序中得到一个 switch 语句,该语句根据响应代码执行不同的操作,如下所示:
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 和async/await。
我该怎么做?
【问题讨论】:
-
别忘了你可能会误报 udp 的数据报,这可能会挂起你的状态机
-
这是我不想使用状态机的原因之一。
-
这个问题不取决于你是否使用状态机。在这两种解决方案中,您都必须检查是否发生超时。我认为使用状态机更容易。 (回复超时重传)
标签: c# asynchronous taskcompletionsource