Как правильно использовать метод OpenWriteAsync, чтобы поместить файл в URL? - PullRequest
0 голосов
/ 18 февраля 2019

Я использовал метод UploadFileAsync для завершения загрузки файла на удаленный сервер до тех пор, пока он не обнаружит файл размером около 1 ГБ, где ОЗУ будет стремительно увеличиваться в размере файла и вылетает приложение.

Небольшое исследованиедолжен привести меня к функции OpenWriteAsync для записи в виде файлового потока вместо того, чтобы пытаться прочитать весь файл сразу, однако я не могу на всю жизнь найти пример VB.NET, который я могу получить, я пытался преобразоватьиз C # и используйте то, что я нашел, и вот что у меня есть:

Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal 
value As T) As T
        target = value
        Return value
    End Function
    Private Sub PushData(ByVal input As Stream, ByVal output As Stream)
        Dim buffer As Byte() = New Byte(4095) {}
        Dim bytesRead As Integer

    While (InlineAssignHelper(bytesRead, input.Read(buffer, 0, 
buffer.Length))) <> 0
        output.Write(buffer, 0, bytesRead)
    End While
End Sub
Private Sub UploadFile(ByVal fileName As String, ByVal data As Stream)
    Dim ub As New UriBuilder("http://someurl.com/uploader")

    Dim c As New WebClient
    AddHandler c.OpenWriteCompleted, AddressOf 
MyOpenWriteCompletedEventHandler
    c.OpenWriteAsync(ub.Uri)
End Sub

Public Sub MyOpenWriteCompletedEventHandler(ByVal sender As Object, ByVal 
e As OpenWriteCompletedEventArgs)
    PushData(Data, e.Result)
    e.Result.Close()
    Data.Close()
End Sub

В обработчике событий OpenWriteComplete, какую переменную я передаю как Data ?

Кроме того, какой обработчик требуется для функции openwriteasync для отслеживания текущего прогресса, этот метод также вызывает событие UploadProgressChanged в объекте веб-клиента?

Спасибо за ваше время.

РЕДАКТИРОВАТЬ:

private void UploadFiles(MyFileInfo mfi, System.IO.FileStream data)
{
UriBuilder ub = new 
UriBuilder("http://localhost:3793/receiver.ashx");
ub.Query = string.Format("filename={0}&name={1}&address={2}&email= 
{3}&golfid={4}", mfi.Name, fixText(txtName.Text), fixText(txtAdress.Text), 
fixText(txtEmail.Text), fixText(txtGolfID.Text));
//ub.Query = string.Format("filename={0}", mfi.Name);
WebClient wc = new WebClient();

wc.OpenWriteCompleted += (sender, e) =>
        {
            PushData(data, e.Result, mfi);
            e.Result.Close();
            data.Close();
            lbl.Text = "Fil(er) uppladdade!";
        };
        wc.OpenWriteAsync(ub.Uri);
    } 

Вот исходный код C # для части, которую я пытался преобразовать - я искал работающий пример VB.NET, который действительно кажется одним деломs не существует!

Частная общая функция InlineAssignHelper (Of T) (цель ByRef как T, значение ByVal как T) Как цель T = значение Возвращаемое значение Конечная функция Private Sub PushData (вход ByVal как поток, выход ByValAs Stream) DIM-буфер As Byte () = Новый байт (4095) {} Dim bytesRead As Integer

    While (InlineAssignHelper(bytesRead, input.Read(buffer, 0, 
buffer.Length))) <> 0
        AddLog("Writing..")
        output.Write(buffer, 0, bytesRead)
    End While
End Sub

Private Sub UploadFileStream(uploadURL As String)
    Dim ub As New UriBuilder(uploadURL)
    AddLog("Uploading to: " & uploadURL)
    ub.Query = String.Format("file1={0}", "D:\test.flv")
    Dim c As New WebClient
    AddHandler c.OpenWriteCompleted, AddressOf OpenWriteCallback
    'AddHandler c.UploadProgressChanged, AddressOf OpenWriteProgress

    c.OpenWriteAsync(ub.Uri)


End Sub

Public Sub OpenWriteCallback(ByVal sender As Object, ByVal e As 
OpenWriteCompletedEventArgs)

    Dim fs As FileStream = File.OpenRead("D:\test.flv")
    AddLog("cb")
    PushData(fs, e.Result)

    If fs Is Nothing Then
            fs.Close()
        AddLog("done")
        MsgBox(e.Result)
    End If


End Sub

Однако, учитывая ваши комментарии, я пришел к выводу, что он пишет, но при поискепри исходящем трафике не происходит загрузка или ответ от сервера, пока он не остановится или не завершится с ошибкой памяти, есть идеи, почему это не работает?

Спасибо

...