【发布时间】:2018-11-27 10:24:27
【问题描述】:
我正在尝试实现一个多重下载功能,它会同时触发和下载 10 个文件。
我也实现了 IProgress 接口,让我知道它的进展情况。
我现在需要的是一个简单的计数器在他们每个人里面说:这是下载#1,这是下载#2,等等。
我不能做一个普通的计数器,因为它们可能同时运行并在我使用/存储值之前更新计数器,导致我的值错误或其中许多值相同。
我已经研究了 Interlocked 类,但我只是找不到合适的实现,它会为每个触发的异步动态函数存储一个特定的数字。
我使用数字将进度存储在一个数组中,所以我会这样调用:
IProgress<double> progressHandler = new Progress<double>(p => HandleUnitProgressBar(p, downloadIndex));
并让处理程序将进度存储在数组的指定单元格中。
谁能指出我正确的方向?
编辑 #1:添加我正在尝试使用的代码:
for (int i = 0; i < _downloadList.Count; i++)
{
var url = _downloadList.ToArray()[i];
Task.Factory.StartNew
(
async () =>
{
try
{
MegaApiClient client = new MegaApiClient();
//client.LoginAnonymous();
downloadIndex = i;
IProgress<double> progressHandler = new Progress<double>(p => HandleUnitProgressBar(p, downloadIndex));
await client.DownloadFileAsync(fileLink, url.Value, progressHandler);
}
catch (Exception e)
{
//will add later
}
}
, CancellationToken.None
, TaskCreationOptions.None
, TaskScheduler.Current
);
}
此代码的问题在于,当它到达 downloadIndex = i 时,i 已经是 4(对于 4 个同时下载),而我想向所有处理程序发送 0、1、2、3 而不是 4。
【问题讨论】:
标签: c# asynchronous task progress class-variables