Имеется большой файл 10-50 мб. Нужно отправить данные файла на сервак и получить ответ. Из-за больших размеров не могу использовать методы без использования stream. Я открываю запрос в новом потоке (thread), оттуда считываю файл кусками и отправляю на сервак.
Но код очень странно выполняется. Во первых не срабатывают события связанные с приемом и отправкой данных, во вторых не смотря на то что я открываю и закрываю Stream в новом Thread основной поток зависает при Stream.close, даже если файл размером 1 мб
Imports System.Net, System.IO, System.Text
Private Sub evtUploadDataChanged(ByVal sender As Object, ByVal e As UploadProgressChangedEventArgs)
Try
Progress1.Value = e.ProgressPercentage
Me.Text = "Total received Content-Length: " & e.TotalBytesToReceive
Catch ex As Exception
MessageBox.Show(ex.Message & Environment.NewLine & e.TotalBytesToReceive)
End Try
End Sub
Private Sub evtUploadDataComleted(ByVal sender As Object, ByVal e As UploadDataCompletedEventArgs)
Try
Me.Text &= "Total received bytes: " & e.Result.Length
Dim RecieveData As Byte()
RecieveData = e.Result
Dim MS As New MemoryStream(RecieveData)
Dim SR As New StreamReader(MS)
Dim BR As New System.IO.BinaryReader(MS)
txtTest.Text = BR.ReadInt32.ToString
txtTest.Text += SR.ReadToEnd
SR.Close()
BR.Close()
MS.Close()
Catch ex As Exception
MessageBox.Show(ex.Message & Environment.NewLine & e.Result.ToString)
End Try
End Sub
Private Sub evtDownloadDataChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
Progress2.Value = e.ProgressPercentage
End Sub
Private Sub evtOpenWriteCompleted(ByVal sender As System.Object, ByVal e As OpenWriteCompletedEventArgs)
'Try
Dim Buffer As Integer = 500000
Dim b(Buffer - 1) As Byte
'PostData = BigData.ToString
Dim FS As New FileStream("MyFile.big", FileMode.Open, FileAccess.Read)
Do While FS.Read(b, 0, Buffer) > 0
e.Result.Write(b, 0, b.Length)
Loop
e.Result.Close()
'Catch ex As Exception
'MessageBox.Show(ex.Message)
'End Try
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
Dim Adress As New Uri("http://188.40.21.40/chronotable/binaryhttp.php")
Dim Web As New Net.WebClient
Web.Headers.Add("Content-Transfer-Encoding: binary")
AddHandler Web.UploadProgressChanged, AddressOf evtUploadDataChanged
AddHandler Web.UploadDataCompleted, AddressOf evtUploadDataComleted
AddHandler Web.DownloadProgressChanged, AddressOf evtDownloadDataChanged
AddHandler Web.OpenWriteCompleted, AddressOf evtOpenWriteCompleted
Web.OpenWriteAsync(Adress, "POST")
End Sub
Ответить
|