C# 使用不同的参数多次调用BackgroundWorker.RunWorkerAsync()

C# 使用不同的参数多次调用BackgroundWorker.RunWorkerAsync(),c#,.net,multithreading,backgroundworker,C#,.net,Multithreading,Backgroundworker,我正在尝试设置文件上载到服务器 我想将文件分成大小为“y”的“n”个块,然后使用线程将“x”个块一次上载到服务器。 当其中一个“x”块完成后,另一个块应开始上载,直到没有更多的块可供上载 我一直在关注BackgroundWorker,并有以下实施想法: 1) 要分配给Worker.DoWork的以下方法 private void ChunkUploaderDoWork(object sender, DoWorkEventArgs e) { //get arguments list for

我正在尝试设置文件上载到服务器

我想将文件分成大小为“y”的“n”个块,然后使用线程将“x”个块一次上载到服务器。 当其中一个“x”块完成后,另一个块应开始上载,直到没有更多的块可供上载

我一直在关注BackgroundWorker,并有以下实施想法:

1) 要分配给Worker.DoWork的以下方法

private void ChunkUploaderDoWork(object sender, DoWorkEventArgs e) {
    //get arguments list form e.arguments and prepare next upload
    //The arguments list contains information such as next chunk number and chunk size etc..
    //Calculate file stream offset based on chunk size and upload the next y bytes.
}
2) 然后我可以打电话

BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (obj, e) => WorkerDoWork();
worker.ProgressChanged += new ProgressChangedEventHandler (Worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (Worker_RunWorkerCompleted);
worker.RunWorkerAsync(argumentsList);
有了backgroundWorker,我也可以让它报告进度,还可以得到完成通知,以便开始上传下一个区块,所以我想使用它的原因有两个。问题是,我不确定是否应该以以下方式调用worker.RunWorkerAsync()(如果一次上载4个块):

然后,当任何工作人员完成并给我一个工作人员完成的回拨时,我可以这样做:

void Worker_RunWorkerCompleted(object sender, ProgressChangedEventArgs e)
{
    //Check if we have any outstanding chunks and upload next chunk if available.
    //for example if we had chunk 5 next in line, then I could call RunWorkerAsync as follows:
    worker.RunWorkerAsync(argumentsListForChunk5);
}
我对c#比较陌生,我想知道这是否是一个完成事情的好方法

简而言之,我的要求是

  • 使用线程上载文件块
  • 限制线程的数量
  • 检查已完成的线程,以便我们可以开始上载下一个文件块
  • 跟踪线程进度
  • 任何帮助都将不胜感激:)

    编辑:: 来自@o_weisman和@HansPassant的评论让我意识到问题缺少以下相关信息。 我正在尝试上载到我控制的服务器。服务器限制了连接速度,因此打开多个连接以上载文件块将导致整体速度提升


    谢谢

    不能将BackgroundWorker用于多个并发操作。 它旨在为UI提供服务,以便在后台执行某些单一操作,并在操作期间或之后更新UI

    对于多个并发操作,最好使用任务。
    一,。每个任务大致上是一个不同的线程。
    二,。您可以创建任意数量的线程,但也可以使用任务工厂上的设置来限制并发线程的数量。
    三,。您可以通过多种方式等待任务,无论是单独的,还是单独的,或者您可以将它们链接在一起,这样一旦一个任务完成,下一个任务就会使用它的结果并继续执行。
    四,。跟踪总是很棘手的。后台工作程序确实为此提供了一种方便的方法,因为它是面向用户界面的。我建议让一个后台工作人员保持活动状态,以便从某个中央状态对象获得连续更新

    这包含了一个很好的解释:

    为什么您需要使用多个线程来上传数据块?如果我有一个10mb的文件,我可以把这个文件分成20个块,每个块0.5mb,然后我可以使用4个线程一次上传4个块。当其中一个区块完成上传后,我可以继续上传行中的下一个区块,依此类推。这些块在服务器上组合成一个文件。与一次性上传整个10mb相比,给我一个减速点。:)我没有问你为什么要把文件切成块,只是为什么不用一个线程依次上传这些块呢?买4个路由器和互联网连接是这种方法的常见障碍。文件服务器通常会在启动多个连接时破坏相同的IP地址,这是一种生存策略。@o_weisman:如果我想按顺序上传文件,为什么要将文件切成块?我可以通过一个线程上传整个文件。我正在尝试“同时”上传多个区块。
    void Worker_RunWorkerCompleted(object sender, ProgressChangedEventArgs e)
    {
        //Check if we have any outstanding chunks and upload next chunk if available.
        //for example if we had chunk 5 next in line, then I could call RunWorkerAsync as follows:
        worker.RunWorkerAsync(argumentsListForChunk5);
    }