Vb.net 我有一个来自ssh的下载文件,但完成下载需要50秒

Vb.net 我有一个来自ssh的下载文件,但完成下载需要50秒,vb.net,winforms,ssh,Vb.net,Winforms,Ssh,我正在使用vb.net下载一个文件,并使用Tamir.SharpSsh,它工作得很好,只是速度很慢,下载一个3.5 kb的文件大约需要50秒。我的问题是,如何最好地将等待函数设置为2分钟,以确保文件被下载 Public Function DownloadPricat() As Boolean Dim retVal As Boolean Dim PRICAT_CSV As String Dim sfilename As String = "" Dim ifilena

我正在使用vb.net下载一个文件,并使用Tamir.SharpSsh,它工作得很好,只是速度很慢,下载一个3.5 kb的文件大约需要50秒。我的问题是,如何最好地将等待函数设置为2分钟,以确保文件被下载

Public Function DownloadPricat() As Boolean
    Dim retVal As Boolean
    Dim PRICAT_CSV As String
    Dim sfilename As String = ""
    Dim ifilename As String

    utils = New ThreeSoftware.Configuration.Utilities.utilConfigurationLoader("CONFIGURATION FILES\GEMINI RELATED\SkechersImport.ini")

    Hostname = utils.GetIniSetting("SSH SECTION", "SSH_HOST", "")
    username = utils.GetIniSetting("SSH SECTION", "SSH_USERNAME", "")
    passsword = utils.GetIniSetting("SSH SECTION", "SSH_PASSWORD", "")
    port = utils.GetIniSetting("SSH SECTION", "SSH_PORT", "")
    HomeDirectoy = utils.GetIniSetting("SSH SECTION", "SSH_REMOTE_DIRECTORY", "")


    transfer = New wcSFtp(Hostname, Integer.Parse(port), username, passsword)

    PRICAT_CSV = utils.GetIniSetting("PATHS SECTION", "PRICAT_CSV", "")
    sfilename = utils.GetIniSetting("PATHS SECTION", "PRICAT_FILENAME", "")

    ifilename = PRICAT_CSV & "\" & sfilename
    If transfer.getFile(HomeDirectoy & "Pricat.edi", ifilename) = True Then
        MsgBox("Download Complete", vbInformation, "Import")
        retVal = True
    Else

        retVal = False
    End If

End Function
获取文件就是这样

Public Function getFile(ByVal remotePath As String, ByVal localFile As String) As Boolean
    Try
        transfer = New Sftp(Me._hostname, Me._username, Me._password)
        transfer.Connect(Me._port)
        transfer.Get(remotePath, localFile)
        transfer.Close()
        Return True
    Catch ex As Exception
        Debug.Print("Error downloading file: " & ex.ToString)
        Return False
    End Try
End Function

将整个下载内容放入backgroundworker的
DoWork()
函数中,并将布尔结果添加为eventargs变量的结果变量。 然后处理backgroundworker的RunWorkerCompleted()事件,并在从那里下载后执行您希望执行的任何任务。这样你就可以确保下载已经完成

Public Class Form1
Private WithEvents LazyBGW As New System.ComponentModel.BackgroundWorker

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Initiate the backgroundworker. It runs in another thread.
    LazyBGW.RunWorkerAsync()
End Sub

Private Sub LazyBGW_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles LazyBGW.DoWork
    'This code runs in the BGW-Thread
    'Perform the whole download task here or just call your 
    e.Result = DownloadPricat()
    'Work is done, put results in the eventargs-variable for further processing
End Sub

Private Sub LazyBGW_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles LazyBGW.RunWorkerCompleted
    'This code runs in the UI-Thread
    Dim results As Boolean = CBool(e.Result)
    MessageBox.Show("The worker is done and our result is: " & results.ToString)
End Sub
End Class
编辑: 在控制台应用程序中,您可以使用任务:

Module Module1
Private Function DownloadPricat() As Boolean
    Threading.Thread.Sleep(10000)
    Return True
End Function
Sub Main()
    Dim DLTask As New System.Threading.Tasks.Task(Of Boolean)(Function() DownloadPricat())
    DLTask.Start()
    Dim ThisTime As Date = Date.Now
    Console.Write("Downloading")
    While DLTask.IsCompleted = False AndAlso DLTask.IsCanceled = False AndAlso DLTask.IsFaulted = False
        If (Date.Now - ThisTime).TotalSeconds > 1 Then
            Console.Write(".")
            ThisTime = Date.Now
        End If
    End While
    Console.Write("Done.")
End Sub

结束模块

我强烈建议不要延迟,以确保完成某项工作。这会产生一种可能有效也可能无效的竞速状态,并且在最好的情况下会给用户造成不必要的额外等待时间。在最坏的情况下,在您的固定延迟后,任务仍然没有完成,并且出现了一些问题。如果3.5Kb下载需要一分钟,那么使用的库肯定有问题。使用更充分的SFTP客户端组件。这对gui应用程序正常工作,我还需要能够通过自动化来完成这项工作?在控制台应用程序中?在下载文件的过程中,你需要其他东西吗?我添加了一个控制台应用程序的示例。它不是控制台应用程序,只是winforms应用程序的auotmation类。我想我在这方面帮不了你。