Нужен совет, правильно ли я применил асинхронный вызов через делегат.
Суть в следующем. Считываются данные с устройства, через последовательный порт (или пишутся на него), после каждого блока чтения/записи считывается подтверждение. Размер принимаемого блока строго фиксированный. Сначала хотел реализовать все это самым простым способом, без отдельного асинхронного потока, но не удалось, поскольку и сами устройства разные, и работа с ними ведется тоже либо через обычный порт, либо через эмулированный либо вообще через BT-канал. И вдобавок скорость самого компьютера, где запускается программа сильно влияет. И естественно, не удается точно считать определенное количество байт из порта. Вернее, считать-то удается, только приходится приостанавливать поток, и вот время этой остановки очень сильно зависит от тех факторов, что я привел. Поначалу пытался измудриться с разными задержками, а потом решил, что это не выход, надо делать как положено. Вот внизу код. Прошу подсказать, может я что-то пропустил, или можно по иному решить ту же самую задачу.
- Код: Выделить всё
'Делегат асинхронного вызова функции чтения
Private Delegate Function ReadData(ByVal ReaderWD As BinaryReader, ByVal Count As Integer) As Object
'Функция чтения для делегата
Private Function ReadBytes(ByVal ReaderWF As System.IO.BinaryReader, ByVal Bytes As Integer) As Object
Dim DataList As New ArrayList
DataList.AddRange(ReaderWF.ReadBytes(Bytes))
Return DataList
End Function
'Создание объектов для чтения и записи
SPort.Open()
Dim Reader As New BinaryReader(SPort.BaseStream)
Dim Writer As New BinaryWriter(SPort.BaseStream)
'Создание экземпляров асинхронного чтения
Dim AsyncInvoker As New ReadData(AddressOf ReadBytes)
Dim AsyncResultA As IAsyncResult
'Запрос данных
For V As Integer = 0 To AddressAsc.Length - 1
CheckSum += AddressAsc(V)
Writer.Write(AddressAsc, V, 1)
If V = AddressAsc.Length - 1 Then
Writer.Write(CType(CheckSum Mod 256, Byte))
End If
Next
'Прием данных
AsyncResultA = AsyncInvoker.BeginInvoke(Reader, 10, Nothing, Nothing)
TempList.AddRange(AsyncInvoker.EndInvoke(AsyncResultA))