如何在Windows窗体上生成动态进度条以进行并行上载进度

问题描述 投票:0回答:1

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

我希望在每次上传文件上传迭代时在Windows窗体上显示动态进度条。

任何人都可以建议使用样本循环迭代,使用Windows窗体上的进度条上传多个文件。

c# winforms progress-bar windows-applications asyncfileupload
1个回答
0
投票

假设您指的是Blob存储。

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

用于处理StorageProgress消息的IProgress对象。

StorageProgress Class

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

在他们的网站上一个不错的小例子,尽管是一个流的例子

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 Class中的TPL dataflow可以适合,或者只是async / await模式与Task.WaitAll Method

数据流示例

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. 创建进度处理程序,并将它们与您的任务相关联 可能会将转移的金额与您的任务保持一致
  3. 在进度上(以线程安全的方式)或仅在计时器上(以线程安全的方式)将进度与预期量相加

显然,这里有详细信息,但是你现在是一名程序员,你的任务(如果你选择接受它)来解决它...免费午餐,我期待你的下一个问题: )

© www.soinside.com 2019 - 2024. All rights reserved.