2016-11-19 5 views
1

Я пытаюсь сделать код, который ждет, пока не будет поднято событие. Я использовал ответ на этой странице answer для связи Tcp. eventPacketReceived будет поднят при получении пакета.Подождите, пока не будет возбуждено событие

Private Sub FooBar() 
    'Send some Tcp Message here` 

    'Wait until a reply is received here 

    'Execute some code when reply is received 

End Sub 

Это код. Отправляет имя файла и для чего принадлежит файл. В нем нет существования файла проверки

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 
     Dim t = New Thread(AddressOf SendFile) 
     Dim f = New FileAndData 
     f.FileList = SlideShowItems 
     f.FileType = "tempSlideShowImage" 
     t.Start(f) 
    End Sub 

    Private Sub SendFile(obj As Object) 
     Dim fD = CType(obj, FileAndData) 
     For Each item In fD.FileList.Items 
      Dim fileIn As New FileStream(item, FileMode.Open) 
      Const chunkSize = 10485760 

      Dim messageFileNamePkt As New TcpMessagePacket(Encoding.Default.GetBytes(Path.GetFileName(item)), TcpMessagePacket.PacketHeader.Filename) 
      messageFileNamePkt.Send(_etcClient.Client) 'Send file name 

      Dim messageFiletype As New TcpMessagePacket(Encoding.Default.GetBytes(fD.FileType), TcpMessagePacket.PacketHeader.Filetype) 
      messageFiletype.Send(_etcClient.Client) 'Send file type 

      'Wait here for reply if for file existence 

      While fileIn.Position < fileIn.Length 
       Dim bytes(chunkSize) As Byte 
       If fileIn.Length - fileIn.Position < bytes.Length Then 
        ReDim bytes(fileIn.Length - fileIn.Position - 1) 
       End If 
       fileIn.Read(bytes, 0, bytes.Length) 

       Dim messageFilePkt As New TcpMessagePacket(bytes, TcpMessagePacket.PacketHeader.FileData) 
       messageFilePkt.Send(_etcClient.Client) 'Send file chunks 

      End While 

      fileIn.Close() 
      Dim messageFileEnd As New TcpMessagePacket(Encoding.Default.GetBytes(""), TcpMessagePacket.PacketHeader.TransferComplete) 
      messageFileEnd.Send(_etcClient.Client) 'Send transfer complete 

     Next 
    End Sub 

Public Class FileAndData 
    Public FileList As ListBox 
    Public FileType As String 
End Class 

И это обработчик для ответа

Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles _etcClient.PacketReceived 
    End Sub 
+1

Привет! Это хорошая реализация моего кода, который у вас есть здесь, однако есть две вещи, которые я хотел бы отметить, что может сделать ее более эффективной: ** 1) ** Размер блока 10485760 байт (10 МБ) равен _very_ чтобы поместить в сетевой буфер для каждой отправки и, скорее всего, значительно замедлить работу. - Из моих собственных тестов я обнаружил, что идеальный размер буфера составляет 8192-32768 (8-32 КБ) - даже по локальной сети. Все выше и ниже этих значений заставляло отправлять гораздо медленнее. –

+0

(Чтобы разделить это на два комментария): ** 2) ** При отправке пакетов без данных вместо 'Encoding.Default.GetBytes (" ")' вы могли просто сделать: 'New Byte() {}' для создания пустого байтового массива. Разница в скорости выполнения между двумя, вероятно, будет всего в несколько сотен микросекунд до миллисекунды, но это все еще является улучшением, которое устраняет ненужную обработку. –

ответ

2

Использование ManualResetEvent. Ex.

Imports System.Threading 
Module Module1 
    Private ReadOnly WaitEvent As New ManualResetEvent(True) 
    Sub Main() 
     For i = 1 To 100 
      WaitEvent.WaitOne() 'This is like a door. It's open because of ManualResetEvent(True) 
      If i = 50 Then 
       WaitEvent.Reset() 'This closes the door 
      End If 
      Console.WriteLine(i) 
     Next 
     Console.Read() 
    End Sub 
    Private Sub SetTheEventWhenCalled() 
     WaitEvent.Set() 'This on the other hand, Opens the door 
    End Sub 
End Module 
+0

Хорошо, я полагаю, я мог бы использовать это ... спасибо человеку! – PapaBless

Смежные вопросы