使用.NET 4创建任务管道?

问题描述:

我想上传文件到一个Web服务。使用.NET 4创建任务管道?

// 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任务并行库来做到这一点?

+0

也许“在Silverlight中一个接一个地执行任务”会是一个更好的标题。 – 2010-12-21 19:53:02

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

+0

我想一个接一个地异步执行此操作。我不想调用UploadFile,因为这会阻止UI。 – 2010-12-21 19:11:05

+0

不确定webService是什么。如果可以,请每上传一个N字节报告进度(例如ProgressChanged事件),并在一个异步请求中立即上载整个文件。换句话说,让它处理分块。如果这不是一个选项,那么在Action 中放置代码(使用webService.UploadFile(...)),并使用BackgroundWorker在后台线程上安排它。 – 2010-12-21 19:17:49

而不是使用TPL,我会推荐使用BackgroundWorker这是专为这种情况下(在GUI应用程序的背景下执行工作)。然后我会调用UploadFile的同步版本。 BackgroundWorker类允许您执行诸如报告进度等操作,并在需要时取消操作。

您可以使用UploadFileAsyncCompleted事件。

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

int chunksSent = 0; 
webService.UploadFileAsyncCompleted += delegate 
{ 
    chunksSent++; 
    if(chunksSent < chunks.Count) 
     webService.UploadFileAsync(..., chunk[chunksSent], ...); 
}; 
webService.UploadFileAsync(..., chunk[0], ...); 

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