我想在一个新线程中开始工作或者使用backgroundworker来做这件事,但之前没有这样做,并且问我应该怎样做。
我的程序有一个datagridview,其中包含一个文件列表,每行一个文件。我希望用户能够选择一行,然后按“开始下载”以开始下载的后台作业。我想了解下载进度的事件。
我有一个类clsDownload来处理所有事情并引发事件但是如何实现后台工作?
我应该在类中使用System.ComponentModel.BackgroundWorker还是创建一个处理它的包装器或使用其他一些线程的东西?
感谢。
编辑:我不明白如何在后台工作中实现我的下载,任何小例子都会非常好。 msdn上的例子并没有让我走得太远。
我有一个具有StartDownload功能的下载类。我应该在课堂上还是在来电者中使用背景工作者? “感到愚蠢”
答案 0 :(得分:3)
我只打算下载并且不需要其他异步处理,您只需使用WebClient
类的异步方法即可。虽然你已经拥有了自己的课程,但这可能不适合你。
否则,您可以按照提到的那样使用BackgroundWorker
。 MSDN页面有一个示例如何操作。
编辑:短篇小说是:
BackgroundWorker
; BackgroundWorker.RunWorkerAsync
; DoWork
事件处理程序中执行后台工作,在您的情况下启动下载类; CancelationPending
; ReportProgress
。如果您需要真正定制的内容,您可以随时创建自己的Thread
。
我个人会坚持使用BackgroundWorker
。它为工作的各个阶段提供了一组很好的通知。如果您使用Thread
,则必须自行实施。
我还要确保代码不会创建太多实例。您希望限制concurent下载的数量,并排除超过该数字的任何内容。
答案 1 :(得分:3)
如果您需要在UI上向用户提供反馈,我强烈建议您BackgroundWorker
。 ProgressChanged
和RunWorkerCompleted
事件在UI线程上运行,因此不需要进行编组,这可能会使您的代码更加复杂。
答案 2 :(得分:1)
我创建了几个包含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)
我将我的作业类声明为当前表单的私有成员,然后在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
希望这有帮助。
答案 3 :(得分:0)
后台工作者看起来应该可行......在MSDN上有一个例子。
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
或者你可以这样做:
WaitCallBack workCallBack= new WaitCallBack(DownloadMethod);
if(!ThreadPool.QueueUserWorkItem(workCallBack, "ThreadPooled")
{
// Unable to Pool
}
// Work has been added to pool and will execute when possible
取决于线程所需的参数。
答案 4 :(得分:0)
使用clsDownload的类(可能是您的Form类)应该使用BackgroundWorker来运行下载方法。