Вот решил позаниматься с потоками, поскольку многие мои проекты являются очень длинными циклами, и после запуска до окончания работы перестают отвечать. Нашел в книгах несколько способов, даже удалось применить, но хотелось бы узнать поподробнее, чтобы не просто применять описанное в книге, а и понимать, что и как.
Вот часть кода. В закомментированных строках применена функция сама по себе и синхронный вызов потока. И показано применение асинхронного вызова. Сама функция является очень длинным циклом.(Она в отдельном модуле).
- Код: Выделить всё
Public Class Form1
Delegate Function Zapr(ByVal B() As Byte) As Byte()
Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Zapros() As Byte = {&HC6, &H4, &H81, &H0, &H21, &H80, &H0}
Dim Potok As New Zapr(AddressOf Read_Config)
'Potok(Zapros)
'Read_Config(Zapros)
Dim ASync As IAsyncResult
ASync = Potok.BeginInvoke(Zapros, Nothing, Nothing)
End Sub
Так вот вопросы следующие: чем отличается синхронный вызов от асинхронного? Само значение этих слов я знаю, но вот хочется знать, что они значат именно в этом контексте. И почему только в случае асинхронного вызова приложение не виснет, а нормально реагирует в процессе выполнения кода. То есть, когда работает цикл, я могу перемещать окно, нажимать другие кнопки и т.п. А в остальных случаях оно встает и так до окончания работы функции.
И еще вопрос, он уже относительно работы с портом.
Вроде более-менее разобрался, применяю вот такую конструкцию:
- Код: Выделить всё
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim B0 As Byte() = {&HC6, &H1, &HB0, &HB1}
Dim A0 As Byte() = {&HC6, &H1, &HB6, &HB7}
Dim B1 As Byte() = New Byte(7) {}
Dim A1 As Byte() = New Byte(7) {}
Try
SerialPort1.PortName = ComboBox1.Text
SerialPort1.BaudRate = 9600
SerialPort1.Open()
Dim BW As New BinaryWriter(SerialPort1.BaseStream)
Dim BR As New BinaryReader(SerialPort1.BaseStream)
For i As Integer = 0 To 3
BW.Write(B0, i, 1)
Next
B1 = BR.ReadBytes(8)
Thread.Sleep(10)
For j As Integer = 0 To 3
BW.Write(A0, j, 1)
Next
A1 = BR.ReadBytes(8)
Catch ex As Exception
End Try
TextBox1.Text = ChrW(B1(3)) & ChrW(B1(4)) & ChrW(B1(5)) & ChrW(B1(6)) &
ChrW(A1(3)) & ChrW(A1(4)) & ChrW(A1(5)) & ChrW(A1(6))
SerialPort1.Close()
End Sub
Как видно из кода, я применил Binary Reader и Binary Writer, хотя можно было бы и просто использовать сам порт. Но мне показалось, что так удобнее, поскольку у данных объектов больше методов.
Подскажите, как будет более правильно. Или может еще какие способы есть.