Vb.net 我有一个来自ssh的下载文件,但完成下载需要50秒
我正在使用vb.net下载一个文件,并使用Tamir.SharpSsh,它工作得很好,只是速度很慢,下载一个3.5 kb的文件大约需要50秒。我的问题是,如何最好地将等待函数设置为2分钟,以确保文件被下载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
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类。我想我在这方面帮不了你。