我有一個使用UDP與硬件設備通信的庫。 談話是這樣的:使用TaskCompletionSource和異步/等待的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
事件處理程序,確實according事情的,switch
statement write驗證碼在響應代碼,就像這樣:
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數據報,這可能會導致你的狀態機不能使用狀態機 –
這是我不想使用狀態機的原因之一。 –
這個問題不取決於你是否使用狀態機。在這兩種解決方案中,您都必須檢查是否發生超時。我認爲州議會更容易。 (當應答超時時重新傳輸) –