在C#

时间:2019-04-09 06:38:53

标签: c# queue

我想一个接一个地下载几个下载请求,因此我正在使用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)中的一个。

我想首先使请求入队,原因是每个请求都将花费一些时间来下载。因此,

  1. 首先排队下载请求

  2. 然后,检查下载循环是否正在运行,如果未运行,请启动 循环

  3. 完成特定下载后,使请求出队。

2 个答案:

答案 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