使用.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任务并行库来做到这一点?
你不需要TPL。将您的方法调用更改为webService.UploadFile(...)。你试图做的是同步上传一个接一个。你为什么需要管道?
我想一个接一个地异步执行此操作。我不想调用UploadFile,因为这会阻止UI。 – 2010-12-21 19:11:05
不确定webService是什么。如果可以,请每上传一个N字节报告进度(例如ProgressChanged事件),并在一个异步请求中立即上载整个文件。换句话说,让它处理分块。如果这不是一个选项,那么在Action
而不是使用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
事件启动,然后再开始上传下一个块。
也许“在Silverlight中一个接一个地执行任务”会是一个更好的标题。 – 2010-12-21 19:53:02