2016-11-19 7 views
1

Ich versuche einen Code zu erstellen, der wartet, bis ein Ereignis ausgelöst wird. Ich habe die Antwort in dieser answer Seite für Tcp-Kommunikation verwendet. Die eventPacketReceived wird ausgelöst, wenn ein Paket empfangen wird.Warten, bis ein Ereignis ausgelöst wird

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

    'Wait until a reply is received here 

    'Execute some code when reply is received 

End Sub 

Dies ist Code Sendet den Dateinamen und wofür die Datei ist. Es fehlt die Existenz Datei

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 

Und dies ist der Handler für die Antwort

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

Hallo! Es ist eine nette Implementierung meines Codes, den Sie hier haben, aber es gibt zwei Dinge, auf die ich hinweisen möchte, die es ein bisschen effizienter machen könnten: ** 1) ** Eine Chunk-Größe von 10485760 Bytes (10 MB) ist _very_ viel, um für jeden Send in den Netzwerkpuffer zu packen und wird die Dinge wahrscheinlich sehr verlangsamen. - Bei der Durchführung eigener Tests habe ich festgestellt, dass die ideale Puffergröße 8192-32768 (8-32 KB) ist - sogar über LAN. Alles über und unter diesen Werten verursachte, dass das Senden viel langsamer ablief. –

+0

(musste in zwei Kommentare aufgeteilt werden): ** 2) ** Beim Senden von Paketen ohne Daten, anstatt 'Encoding.Default.GetBytes (" ")' könnten Sie einfach tun: 'New Byte() {}' um ein leeres Byte-Array zu erstellen. Der Ausführungsgeschwindigkeitsunterschied zwischen den beiden wird wahrscheinlich nur einige hundert Mikrosekunden bis zu einer Millisekunde betragen, aber es ist immer noch eine Verbesserung, die unnötige Verarbeitung entfernt. –

Antwort

2

Verwenden ManualResetEvent überprüfen. 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

Okay, ich nehme an, ich könnte das benutzen .. Danke, Mann! – PapaBless

Verwandte Themen