vb. net значение индикатора выполнения вызывает исключение ArgumentOutOfRange при загрузке файла с использованием await async - PullRequest
1 голос
/ 26 мая 2020

Я не могу обновить значение ProgressBar, я тоже пробовал Convert.ToInt32(Bytes as long). Но это не сработало. Я использую Progress (целого числа).

'Button OnClick



Public Shared s3client As AmazonS3Client
Public Shared myProgress As Progress(Of Integer)  
Public Shared Bytes As Double
Public Shared myProgress As Progress(Of Integer)
Public Shared bucketName As String = "S3BucketName"

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click

 Dim AllowedFiles As List(Of String) = New List(Of String)

            Try
                Dim TheSize As Long
                Dim TotalSize As Long
                For Each file In AllowedFiles
                    TheSize = Long.Parse((My.Computer.FileSystem.GetFileInfo(file).Length))
                    TotalSize += TheSize
                Next

                Select Case TotalSize
                    Case Is >= 1099511627776
                        Bytes = CDbl(TotalSize / 1099511627776) 'TB
                    Case 1073741824 To 1099511627775
                        Bytes = CDbl(TotalSize / 1073741824) 'GB
                    Case 1048576 To 1073741823
                        Bytes = CDbl(TotalSize / 1048576) 'MB
                    Case 1024 To 1048575
                        Bytes = CDbl(TotalSize / 1024) 'KB
                    Case 0 To 1023
                        Bytes = TotalSize ' bytes
                    Case Else
                        Bytes = 0
                        'Return ""
                End Select

                ProgForm2.CPBar1.Value = 0
                ProgForm2.CPBar1.Minimum = 0
                ProgForm2.CPBar1.Maximum = Convert.ToInt32(Bytes)

                Dim result As DialogResult = MessageBox.Show("Selected  " & TotalFiles & " files have " & CalculateSize.ToString & "" & SizeType, "in total Size", MessageBoxButtons.OKCancel, MessageBoxIcon.Information)

                If result = DialogResult.OK And TextBox1.Text IsNot "" = True Then

                    myProgress = New Progress(Of Integer)(AddressOf ReportProgress)
                         Foldername=Textbox1.Text
                        For Each file In AllowedFiles
                            Try
                                ProgForm2.Show()
                                Await AddFileToRootFolderAsync(file, bucketName, Foldername, myProgress)
                                TheSize = Long.Parse(My.Computer.FileSystem.GetFileInfo(file).Length)

                            Catch ex As Exception
                                MessageBox.Show(ex.Message)
                            End Try

                            ProgForm2.CPBar1.Text = ProgForm2.CPBar1.Value.ToString + "/" + Form2.CPBar1.Maximum.ToString
                        Next

                        ProgForm2.CPBar1.Value = ProgForm2.CPBar1.Maximum
                        If ProgForm2.CPBar1.Value = ProgForm2.CPBar1.Maximum Then
                            ProgForm2.CPBar1.Text = "Task Completed"
                            ProgForm2.Button1.Show()
                        End If
                 Else
                     Exit Sub
                 End if

End Sub

'file uploading function

Public Async Function AddFileToFolderAsync(FileName As String, bucketName As String, folderName As String, ByVal myProgress As IProgress(Of Integer)) As Task


        Try
                If AmazonS3Util.DoesS3BucketExistV2(s3client, bucketName) Then

                    Dim Checkresult = FolderCheck(bucketName, folderName) /'Folder Exist or Not
                    If Checkresult = True Then
                        Dim keyname As String = "" 'destination path(s3 bucket folder)
                        Dim filepath As String = FileName 'current file's local fullpath
                        Dim fname As String = Path.GetFileName(FileName) 'filename
                        If Not folderName.EndsWith("/") Then
                            keyname += folderName & "/"
                            keyname += fname  'bucket's target folder /fname (eg:folder/subfolder/file.mp4)
                        Else
                            keyname += fname  'bucket's target folder /fname (eg:folder/subfolder/file.mp4)
                        End If

                        Dim fileTransferUtility = New TransferUtility(s3client)
                        Dim fileTransferUtilityRequest = New TransferUtilityUploadRequest With {
                            .BucketName = bucketName,
                            .FilePath = filepath,
                            .StorageClass = S3StorageClass.Standard,
                            .ServerSideEncryptionMethod = ServerSideEncryptionMethod.None,
                            .PartSize = 6291456,
                            .Key = keyname,
                            .ContentType = "*.*"}
                        AddHandler fileTransferUtilityRequest.UploadProgressEvent,
                         Sub(sender As Object, e As UploadProgressArgs)
                             Dim percent As Integer = Convert.ToInt32(e.TransferredBytes)  //e.TransferredBytes as long
                             myProgress.Report(percent)
                         End Sub
                        Await fileTransferUtility.UploadAsync(fileTransferUtilityRequest)
                    Else
                        MessageBox.Show(folderName + " folder does not exist")
                    End If
                Else
                    MessageBox.Show(bucketName + " Bucket does not exist")
                End If

            Catch ex As AmazonS3Exception
            MessageBox.Show(ex.Message + " Upload task canceled.")

        Catch ex As Exception
            MessageBox.Show(ex.Message + " Upload task canceled.")

        End Try

    End Function
Public Sub ReportProgress(ByVal myInt As Integer)

    Form2.CPBar1.Value += myInt

    Form2.CPBar1.Text = Form2.CPBar1.Value.ToString + "/" + Form2.CPBar1.Maximum.ToString 

End Sub

Я застрял в этом, не могу знать, что я пропустил. Я хочу прогрессировать Байт который передается в целевую папку в моем индикаторе выполнения. например, размер файла составляет 1 ГБ (1073741824 байта), тогда как я могу установить максимальное значение Progressbar = 1073741824 и значение индикатора выполнения + = переданные байты.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Кажется, что когда вы хотите вычислить максимальное значение, вы учитываете значение TotalSize с помощью механизма Select-Case и, следовательно, масштабируете его в зависимости от диапазона. Но в ReportProgress входное целое число myInt напрямую добавляется к значению индикатора выполнения. Я думаю, что ваш Select-Case также должен быть реализован в ReportProgress.

Edit 1:

Предположим, что TotalSize = 109951162777. Правильно? Следовательно, Byte = 1 и максимальное значение индикатора выполнения равно 1 (т. Е. 1 ТБ). Затем в функции ReportProgress вы должны сначала разделить myInt (который в байтах) на 109951162777, чтобы сделать его значением ТБ (например, 0,5 ТБ), а затем обновить значение индикатора выполнения. Если вы этого не сделаете, myInt превысит предел int32 и возникнут ошибки. Я прав? Следовательно, вы должны знать, какой регистр выбран в операторе Select-Case и на какое число делится TotalSize? Я рекомендую изменить функцию Button1_Click как:

Dim divider as long
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click

 Dim AllowedFiles As List(Of String) = New List(Of String)

            Try
                Dim TheSize As Long
                Dim TotalSize As Long
                For Each file In AllowedFiles
                    TheSize = Long.Parse((My.Computer.FileSystem.GetFileInfo(file).Length))
                    TotalSize += TheSize
                Next

                Select Case TotalSize
                    Case Is >= 1099511627776
       divider = 1099511627776 'TB                        
                    Case 1073741824 To 1099511627775
                        divider = 1073741824 'GB
                    Case 1048576 To 1073741823
                        divider = 1048576 'MB
                    Case 1024 To 1048575
                        divider = 1024 'KB
                    Case 0 To 1023
                        divider = 1  ' bytes
                    Case Else
                        Bytes = 0
       divider = 1
                        'Return ""
                End Select

                Bytes = CDbl(TotalSize / divider)  'always between 0 and 1

                ProgForm2.CPBar1.Value = 0
                ProgForm2.CPBar1.Minimum = 0
                ProgForm2.CPBar1.Maximum = Convert.ToInt32(Bytes)

                Dim result As DialogResult = MessageBox.Show("Selected  " & TotalFiles & " files have " & CalculateSize.ToString & "" & SizeType, "in total Size", MessageBoxButtons.OKCancel, MessageBoxIcon.Information)

                If result = DialogResult.OK And TextBox1.Text IsNot "" = True Then

                    myProgress = New Progress(Of Integer)(AddressOf ReportProgress)
                         Foldername=Textbox1.Text
                        For Each file In AllowedFiles
                            Try
                                ProgForm2.Show()
                                Await AddFileToRootFolderAsync(file, bucketName, Foldername, myProgress)
                                TheSize = Long.Parse(My.Computer.FileSystem.GetFileInfo(file).Length)

                            Catch ex As Exception
                                MessageBox.Show(ex.Message)
                            End Try

                            ProgForm2.CPBar1.Text = ProgForm2.CPBar1.Value.ToString + "/" + Form2.CPBar1.Maximum.ToString
                        Next

                        ProgForm2.CPBar1.Value = ProgForm2.CPBar1.Maximum
                        If ProgForm2.CPBar1.Value = ProgForm2.CPBar1.Maximum Then
                            ProgForm2.CPBar1.Text = "Task Completed"
                            ProgForm2.Button1.Show()
                        End If
                 Else
                     Exit Sub
                 End if

End Sub

и ReportProgress следующим образом:

    Form2.CPBar1.Value += myInt / divider ‘to normalize myInt to [0,1]

    Form2.CPBar1.Text = Form2.CPBar1.Value.ToString + "/" + Form2.CPBar1.Maximum.ToString 

Надеюсь, это решит проблему.

0 голосов
/ 26 мая 2020

ПРИМЕЧАНИЕ: Это неверно. это то, что я пробовал после ответа @Saeed Sayyadipour.

Отредактировано: Тогда как насчет e.TransferredBytes Что входит в функцию загрузки ?. Я пробовал тот же случай выбора в

Public Async Function AddFileToRootFolderAsync(FileName As String, bucketName As String, folderName As String, ByVal myProgress As IProgress(Of Integer)) As Task


        Try
            If AmazonS3Util.DoesS3BucketExistV2(s3client, bucketName) Then

                Dim Checkresult = RootFolderCheck(bucketName, folderName)
                If Checkresult = True Then
                    Dim keyname As String = "" 'destination path(s3 bucket folder)
                    Dim filepath As String = FileName 'current file's local fullpath
                    Dim fname As String = Path.GetFileName(FileName) 'filename
                    If Not folderName.EndsWith("/") Then
                        keyname += folderName & "/"
                        keyname += fname  'bucket's target folder /fname (eg:folder/subfolder/file.mp4)
                    Else
                        keyname += fname  'bucket's target folder /fname (eg:folder/subfolder/file.mp4)
                    End If

                    Dim fileTransferUtility = New TransferUtility(s3client)
                    Dim fileTransferUtilityRequest = New TransferUtilityUploadRequest With {
                            .BucketName = bucketName,
                            .FilePath = filepath,
                            .StorageClass = S3StorageClass.Standard,
                            .ServerSideEncryptionMethod = ServerSideEncryptionMethod.None,
                            .PartSize = 6291456,
                            .Key = keyname,
                            .ContentType = "*.*"}
                    AddHandler fileTransferUtilityRequest.UploadProgressEvent,
                         Sub(sender As Object, e As UploadProgressArgs)
                             Select Case e.TransferredBytes
                                 Case Is >= 1099511627776
                                     divider = 1099511627776 'TB                        
                                 Case 1073741824 To 1099511627775
                                     divider = 1073741824 'GB
                                 Case 1048576 To 1073741823
                                     divider = 1048576 'MB
                                 Case 1024 To 1048575
                                     divider = 1024 'KB
                                 Case 0 To 1023
                                     divider = 1  ' bytes
                                 Case Else
                                     Bytes = 0
                                     divider = 1
                                     'Return ""
                             End Select

                             Dim percent As Double = CDbl(e.TransferredBytes / Bytes)
                             myProgress.Report(Convert.ToInt32(percent))
                         End Sub
                    Await fileTransferUtility.UploadAsync(fileTransferUtilityRequest)
                Else
                    MessageBox.Show(folderName + " folder does not exist")
                End If
            Else
                MessageBox.Show(bucketName + " Bucket does not exist")
            End If

        Catch ex As AmazonS3Exception
            MessageBox.Show(ex.Message + " Upload task canceled.")

        Catch ex As Exception
            MessageBox.Show(ex.Message + " Upload task canceled.")

        End Try

    End Function 

Public Sub ReportProgress(ByVal myInt As Integer)
        Form2.CPBar1.Value += myInt / divider

        Form2.CPBar1.Text = Form2.CPBar1.Value.ToString + "/" + Form2.CPBar1.Maximum.ToString '+ "" + sizetype

    End Sub

, я пробовал с файлом 2,88 МБ, но он показывает исключение аргумента вне диапазона в Form2.CPBar1.Value += myInt / divider. максимальное значение - 3, а затем значение myint - 36. я не знаю почему? это так запутано! : {
Любые идеи приветствуются.

...