1

我想将文件分块上传到 Web 服务。

// Web service method:
void UploadFile(int fileId, byte[] chunk, int position, bool complete);

使用 .NET 4 任务并行库,我想一次上传一个文件。

我在客户端上有字节块,我可以上传每个块就好了:

List<byte[]> chunks = ...;
webService.UploadFileAsyncCompleted += OnChunkUploaded;
foreach (var chunk in chunks)
{
   webService.UploadFileAsync(...);
}

但是,这会同时上传所有块。我想一个接一个地上传每个块。一个管道,如果你愿意的话。

如何使用 .NET 4 任务并行库来做到这一点?

4

4 回答 4

4

我建议不要使用 TPL,而是使用BackgroundWorker专为这种场景设计的(在 GUI 应用程序的后台执行工作)。然后我会将同步版本称为 UploadFile。该类BackgroundWorker允许您执行报告进度等操作,并在需要时取消操作。

于 2010-12-21T19:16:14.930 回答
3

您不需要 TPL。将您的方法调用更改为 webService.UploadFile(...)。您要做的是同步上传一件接一件。为什么需要管道?

于 2010-12-21T19:09:26.737 回答
0

您可以UploadFileAsyncCompleted为此使用事件。

启动第一个异步块上传。然后让UploadFileAsyncCompleted事件处理程序继续下一步。粗略地说,这是:

int chunksSent = 0;
webService.UploadFileAsyncCompleted += delegate
{
    chunksSent++;
    if(chunksSent < chunks.Count)
        webService.UploadFileAsync(..., chunk[chunksSent], ...);
};
webService.UploadFileAsync(..., chunk[0], ...);
于 2010-12-21T19:34:26.560 回答
0

使用并行库按顺序执行操作可能不是最好的主意。F# 和 C# 5 CTP 都具有非常好的异步编程模型 - 但如果您无法使用这些模型,您只需等待UploadFileAsyncCompleted事件触发,然后再开始上传下一个块。

于 2010-12-21T19:37:50.920 回答