如何在 windows 表单上生成并行上传进度的动态进度条
How to generate dynamic progress bar on windows form for parallel upload progress
我必须创建一个 Windows 应用程序,我将在其中将多个文件上传到 azure 文件共享存储,我需要在 windows 中使用进度条控件显示多个文件上传进度以供应用程序使用。
我想在文件上传的每次上传迭代时在 windows 表单上显示动态进度条。
任何人都可以建议使用 windows 表单上的进度条使用示例循环迭代上传多个文件。
假设您指的是 Blob 存储。
A IProgress object to handle StorageProgress messages.
Holds information about the progress data transfers for both request
and response streams in a single operation.
他们网站上的一个很好的小例子,尽管是一个流例子
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 bound 最好的工作 not 使用 Parallel.For
或 Parallel.ForEach
这是一种资源浪费。
然而,ActionBlock Class in the TPL dataflow can be suited, or just async
/await
pattern with 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;
因此无需为您编写其余代码
- 在开始传输之前,只需将文件的大小(以字节为单位)相加即可。
- 创建您的进度处理程序,并将它们与您的任务相关联
- 可能会在您的任务中保留转账金额
- 关于进度(以线程安全的方式)或只是在计时器上(以线程安全的方式)将您的进度与预期数量相加
显然这里遗漏了一些细节,但是你现在是一名程序员,你的使命(如果你选择接受它)弄清楚..免费午餐,我期待你的下一个问题关于两者之间的一切:)
我必须创建一个 Windows 应用程序,我将在其中将多个文件上传到 azure 文件共享存储,我需要在 windows 中使用进度条控件显示多个文件上传进度以供应用程序使用。
我想在文件上传的每次上传迭代时在 windows 表单上显示动态进度条。
任何人都可以建议使用 windows 表单上的进度条使用示例循环迭代上传多个文件。
假设您指的是 Blob 存储。
A IProgress object to handle StorageProgress messages.
Holds information about the progress data transfers for both request and response streams in a single operation.
他们网站上的一个很好的小例子,尽管是一个流例子
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 bound 最好的工作 not 使用 Parallel.For
或 Parallel.ForEach
这是一种资源浪费。
然而,ActionBlock Class in the TPL dataflow can be suited, or just async
/await
pattern with 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;
因此无需为您编写其余代码
- 在开始传输之前,只需将文件的大小(以字节为单位)相加即可。
- 创建您的进度处理程序,并将它们与您的任务相关联
- 可能会在您的任务中保留转账金额
- 关于进度(以线程安全的方式)或只是在计时器上(以线程安全的方式)将您的进度与预期数量相加
显然这里遗漏了一些细节,但是你现在是一名程序员,你的使命(如果你选择接受它)弄清楚..免费午餐,我期待你的下一个问题关于两者之间的一切:)