我想一个接一个地下载几个下载请求,因此我正在使用Queue。这是列表,在不同的时间从不同的脚本中填充
public Queue<WebDownloader> webDownloaderQ;
一个公共方法允许不同的脚本/资源在不同的时间动态填充队列:
public void EnqueABDownloading(WebDownloader abToDownload)
{
singleAbLoader.Enqueue(abToDownload);
}
下载过程很快就开始,因为它甚至发现了一个que对象(请记住,在此时间队列中可以增加),
public void StartDownloading()
{
//while (singleAbLoader.Count > 0)
//{
// singleAbLoader.
//}
for (int i = 0; i < singleAbLoader.Count; i++)
{
singleAbLoader[i].//this is not supporting unable to call my method
//I want to call one of the function (startdowloaind) of WebDownloader before the deque
}
}
我试图编写上述用于下载的函数,但是问题是,我不知道该怎么做。我试图对它说不能将索引应用于Queue类型的表达式的对象使用索引。
编辑:
记住:我想在使对象出队之前调用StartDowloaind
的函数(WebDownloader
)中的一个。
我想首先使请求入队,原因是每个请求都将花费一些时间来下载。因此,
首先排队下载请求
然后,检查下载循环是否正在运行,如果未运行,请启动 循环
完成特定下载后,使请求出队。
答案 0 :(得分:1)
您可以使用foreach
遍历队列。 foreach
不会出队
public void StartDownloading()
{
foreach(WebDownloader wd in singleAbLoader)
{
wd.Start();
}
}
考虑您的评论:
由于下载可能无法按照开始的顺序完成,因此请使用List
而不是队列。
您的课程WebDownloader
显然有类似DownloadCompleted
事件,您可以从那里的列表中将其删除。或者如果您需要它,只需将其添加到已完成下载的队列中即可。
答案 1 :(得分:0)
请使用Dequeue方法弹出如下所示的项目
while (singleAbLoader.Count>0)
(
WebDownloader method= singleAbLoader.Dequeue();
method.StartDowloaind();
}
这样,即使队列增加了,它也将继续使用弹出窗口,而无需索引。
如果队列将被多个线程使用,我还建议使用ConcurrentQueue