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 event
PacketReceived
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
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. –
(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. –