首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与WebClient并行上传文件

与WebClient并行上传文件
EN

Stack Overflow用户
提问于 2021-06-30 00:23:37
回答 1查看 37关注 0票数 1

我需要在项目中使用WebClient将文件拆分为多个部分,并并行上传它们。到目前为止,我可以一次上传一个部分,但不确定如何并行上传它们。

我有一个UploadPart方法,如下所示:

代码语言:javascript
复制
private async Task<PartETag> UploadPart(string filePath, string preSignedUrl, int partNumber)
{
    WebClient wc = new();
    wc.UploadProgressChanged += WebClientUploadProgressChanged;
    wc.UploadFileCompleted += WebClientUploadCompleted;
    _ = await wc.UploadFileTaskAsync(new Uri(preSignedUrl), "PUT", filePath);

    // Obtain the WebHeaderCollection instance containing the header name/value pair from the response.
    WebHeaderCollection myWebHeaderCollection = wc.ResponseHeaders;
    string formattedETag = myWebHeaderCollection.GetValues("ETag").FirstOrDefault().Replace(@"""", "");
    PartETag partETag = new(partNumber, formattedETag);

    return partETag;
}

它在foreach循环中调用:

代码语言:javascript
复制
foreach (var part in parts)
{
    var partETag = await UploadPart(part.FilePath, part.PresignedUrl, part.Number);
    partETags.Add(partETag);
}

我如何修改它,以便我并行上传分块(一次最多10个分块),同时仍然在响应头中返回PartETag值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-30 00:51:17

对于TPL Dataflow来说,这是一个完美的场景

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;

var parts = new List<Part>();
var partEtags = new List<PartETag>();

var transformBlock = new TransformBlock<Part, PartETag>
(
    async part => await UploadPart(part.FilePath, part.PreSignedUrl, part.PartNumber),
    new ExecutionDataflowBlockOptions {MaxDegreeOfParallelism = 10}
);

var actionBlock = new ActionBlock<PartETag>(partETag => partEtags.Add(partETag));

transformBlock.LinkTo(actionBlock, new DataflowLinkOptions {PropagateCompletion = true});

foreach (Part part in parts)
{
    transformBlock.Post(part);
}

transformBlock.Complete();

await actionBlock.Completion;

我对你的类做了一些假设,因为你没有展示你所有的代码。位于顶部的parts列表显然需要在其中包含实例。

这段代码创建了一个异步执行工作的数据流,并将并行执行限制为10个。这些块与完成传播相关联,因此我们等待操作块的完成,以确保所有操作都完成。

完成后,您的partEtags列表将包含所有结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68182452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档