首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在windows窗体上为并行上传进度生成动态进度条

如何在windows窗体上为并行上传进度生成动态进度条
EN

Stack Overflow用户
提问于 2018-04-03 07:14:20
回答 1查看 570关注 0票数 1

我必须创建一个Windows应用程序,在该应用程序中,我将上传多个文件到azure文件共享存储,并且我需要使用windows中的进度条控件显示多个文件上传进度。

我想显示windows窗体上的动态进度条和每次文件上传的迭代。

有谁能建议用样例循环迭代来上传多个文件,使用windows窗体上的进度条。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-03 07:42:12

假设您指的是Blob存储。

UploadFromFileAsync(String,AccessCondition,BlobRequestOptions,OperationContext,IProgress,CancellationToken)

一个处理IProgress消息的StorageProgress对象。

StorageProgress类

保存有关单个操作中请求流和响应流的进度数据传输的信息。

在他们的网站上有一个很好的例子,也就是一个流例子。

代码语言:javascript
复制
CancellationToken cancellationToken = new CancellationToken();
IProgress<StorageProgress> progressHandler = new Progress<StorageProgress>(
    progress => Console.WriteLine("Progress: {0} bytes transferred", progress.BytesTransferred)
    );

await blob.UploadFromStreamAsync(
    srcStream,
    default(AccessCondition),
    default(BlobRequestOptions),
    default(OperationContext),
    progressHandler,
    cancellationToken
    );

那么从这里到哪里。因为这是IO绑定工作,所以它最好的而不是使用Parallel.ForParallel.ForEach,这是对资源的浪费。

但是,ActionBlock类中的TPL数据流可以适合,或者只是async/await模式与Task.WaitAll法

数据流示例

代码语言:javascript
复制
var block = new ActionBlock<MySomething>(
    mySomething => MyMethodAsync(mySomething),
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 });

foreach (var something in ListOfSomethings)
{
    block.Post(something );
}

block.Complete();
await block.Completion;

所以不用为你写剩下的代码

  1. 在开始您的传输之前,简单地将文件的大小加起来(以字节为单位)。
  2. 创建进度处理程序,并将它们与任务关联
    • 可能在你的任务中保留转移的金额

  1. 在进度上(以线程安全的方式)或仅在timmer上(以线程安全的方式)将您的进度与预期的金额相加

显然,这里没有细节,但你现在是一个程序员,你的任务(如果你选择接受它)来解决它。免费午餐,我期待着您对中间的每件事的下一个问题:)

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

https://stackoverflow.com/questions/49624284

复制
相关文章

相似问题

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