我想在一个新线程中开始一份工作或使用后台工作人员来做这件事,但之前还没有做过,并问你我应该怎么做。
我的程序有一个包含文件列表的 datagridview,每行一个文件。我希望用户能够选择一行,然后按“开始下载”开始下载的后台作业。我想获取有关下载进度的事件。
我有一个类 clsDownload 处理所有事情并引发事件,但我如何实现后台工作?
我应该在类中使用 System.ComponentModel.BackgroundWorker 还是创建一些处理此问题的包装器或使用其他一些线程处理的东西?
谢谢。
编辑: 我不明白如何在后台工作器中实现我的下载,任何小例子都会非常好。 msdn 上的例子并没有让我走得更远。
我有一个具有 StartDownload 功能的下载类。我应该在类里面还是在调用者中使用后台工作人员? “感觉很傻”
最佳答案
我创建了几个包含 BackgroundWorker 的不同类。我通常做的是在表单上有一个 BackgroundWorker 组件,该组件将在执行作业时打开,然后我将该实例传递给我的作业类的构造函数。
您的工作类别可能如下所示:
Private m_bwMain As BackgroundWorker
Public Sub New(ByVal bwMain As BackgroundWorker)
m_bwMain = bwMain
'additional setup code here
End Sub
要开始一项工作,您可以在“开始下载”按钮的 Click 事件处理程序中执行以下操作:
lblStatus.Text = "Initializing ..."
bgwMain.RunWorkerAsync(someFileName)
我将我的作业类声明为当前表单的私有(private)成员,然后在 BackgroundWorker.DoWork 事件中实例化它。从那里你可以调用你的方法来下载文件:
Private Sub bgwMain_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwMain.DoWork
m_oJobEngine = New JobEngine(CType(sender, BackgroundWorker))
m_oJobEngine.DownloadFile(CStr(e.Argument))
End Sub
要向用户报告进度,您可以在主窗体中处理您的类引发的事件。您只需要确保作业类对象声明具有 WithEvents 关键字。您可以从这些处理程序调用 BackgroundWorker 的 ReportProgress 方法。在 ReportProgress 中,您可以对 UI 进行任何需要的更改以指示进度。下面是一个例子:
Private Sub m_oJobEngine.DownloadProgress(ByVal bgw as Backgroundworker, ByVal bytesTransferred as Long) Handles m_oJobEngine.DownloadProgress
bgw.ReportProgress(0, bytesTransferred)
End Sub
Private Sub bgwMain_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwMain.ProgressChanged
lblStatus.Text = CLng(e.UserState).ToString & " bytes transferred."
End Sub
希望这可以帮助。
关于c# - 作为新线程运行类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/614111/