Выполнить операцию перед удалением из очереди в C#

#c# #queue

#c# #очередь

Вопрос:

Есть несколько запросов на загрузку, которые я хочу обслуживать один за другим, и по этой причине я использую 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. По мере завершения загрузки удалите запрос из очереди.

Комментарии:

1. Используйте foreach вместо этого. Но почему бы вам просто не начать загрузку, когда вы ставите ее в очередь?

2. Можете ли вы быть более конкретными

3. Сделайте это вместо singleAbLoader.ElementAt(i) , Queue<T> не предоставляет индексатор, поскольку он реализует IEnumerable<T> и IReadOnlyCollection<T>

4. @KunalMukherjee не используйте ElementAt , поскольку ему нужно повторять коллекцию каждый раз, когда вы ее вызываете.

5. Я все еще не понимаю, почему вы не можете поставить ее в очередь и запустить загрузку одновременно… И подключить событие для обработки удаления из очереди после завершения загрузки.

Ответ №1:

Вы можете использовать foreach для перебора вашей очереди. foreach не удаляет из очереди

  public void StartDownloading()
 {
        foreach(WebDownloader wd in singleAbLoader)
        {
             wd.Start();
        }
 }
  

Учитывая ваш комментарий:

Поскольку загрузки могут завершаться не в том порядке, в котором они начинаются, поэтому используйте List вместо Queue.

В вашем классе, WebDownloader очевидно, есть что-то вроде DownloadCompleted event, вы можете удалить его из списка там. или, если вам это нужно, просто добавьте его в очередь завершенных загрузок.

Комментарии:

1. Я не только хочу начать загрузку, но и хочу отменить очередь, если определенная загрузка завершена.

Ответ №2:

пожалуйста, используйте метод удаления из очереди, чтобы открыть элемент следующим образом

 while (singleAbLoader.Count>0)
(
WebDownloader method= singleAbLoader.Dequeue();
 method.StartDowloaind();

}
  

таким образом, даже если очередь увеличивается, она будет продолжать использовать всплывающее окно и без необходимости в индексе.

Я также предлагаю использовать ConcurrentQueue , если очередь будет использоваться несколькими потоками

Комментарии:

1. я хочу вызвать одну из функций (startdowloaind) WebDownloader перед удалением

2. @MuhammadFaizanKhan я думаю, мы могли бы удалить очередь, затем вызвать функцию запуска загрузки, и если произойдет какая-либо ошибка, мы снова поставим в очередь, что вы думаете?