我想在新线程中开始一项工作或使用后台工作人员来执行此操作,但之前没有这样做过,并询问您应该以哪种方式执行此操作。

我的程序有一个带有文件列表的数据网格视图,每行一个文件。我希望用户能够选择一行,然后按“开始下载”来启动下载的后台作业。我想获取下载进度的事件。

我有一个类 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)

我将我的作业类声明为当前表单的私有成员,然后在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

希望这有帮助。

其他提示

如果你只需要下载并且不需要其他异步处理,你可以只使用 async 方法 WebClient 班级。尽管您已经拥有自己的课程,但这可能不是您的解决方案。

否则,您可以使用 BackgroundWorker 正如你提到的。MSDN 页面有一个如何执行此操作的示例。

编辑: 短篇故事是:

  • 您创建了 BackgroundWorker 来自呼叫者;
  • 当你想开始后台工作时,你调用 BackgroundWorker.RunWorkerAsync;
  • 在里面 DoWork 事件处理程序,您执行后台工作,在您的情况下,您开始下载类;
  • 当你在做后台工作时,你必须每隔一段时间检查一次 CancelationPending;
  • 当你想报告一些进度时,你需要以百分比计算并调用 ReportProgress.

如果您需要真正定制的东西,您可以随时创建自己的东西 Thread.

我个人会坚持 BackgroundWorker. 。它针对工作的各个阶段提供了一组很好的通知。如果你使用 Thread, ,您必须自己实现这些。

我还要确保代码不会创建太多实例。您想要限制并发下载的数量并对超过该数量的任何内容进行排队。

如果您需要在UI上向用户提供反馈,我强烈建议 BackgroundWorker ProgressChanged RunWorkerCompleted 事件在UI线程上运行,因此不需要进行编组,这可能会使您的代码更加复杂。

后台工作者看起来应该可行......在MSDN上有一个例子。

http://msdn.microsoft.com/en -us /库/ 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

取决于线程所需的参数。

使用clsDownload的类(可能是您的Form类)应该使用BackgroundWorker来运行下载方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top