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

Есть несколько запросов на загрузку, которые я хочу обработать один за другим, и по этой причине я использую Queue. Вот список, который заполняется из разных скриптов в разное время

 public Queue<WebDownloader> webDownloaderQ;

Публичный метод позволяет различным сценариям/ресурсам динамически заполнять очередь в разное время:

 public void EnqueABDownloading(WebDownloader abToDownload)
    {
        singleAbLoader.Enqueue(abToDownload);
    }

Загрузка начинается быстро, так как найден даже один объект очереди (помните, что за это время очередь может увеличиваться),

     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. Когда конкретная загрузка завершает удаление запроса из очереди.

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

Magnus 09.04.2019 08:42

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

TheGeneral 09.04.2019 08:42

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

Kunal Mukherjee 09.04.2019 08:42

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

Magnus 09.04.2019 08:49

@Magnus верно, что это будет доступ O(n), но все же рекомендуется вместо этого использовать цикл foreach.

Kunal Mukherjee 09.04.2019 08:51

Дополнительная информация добавлена ​​в вопрос, пожалуйста, проверьте.

Muhammad Faizan Khan 09.04.2019 09:02

@Magnus Я хочу сначала поставить в очередь, причина в том, что для загрузки каждого запроса потребуется некоторое время. поэтому сначала выполните enque, затем проверьте, работает ли цикл, если нет, инициируйте цикл.

Muhammad Faizan Khan 09.04.2019 09:05

Я добавил больше информации, включая шаги. Пожалуйста, проверьте.

Muhammad Faizan Khan 09.04.2019 09:08

Я бы посоветовал вам две очереди (или, что более вероятно, BlockingCollections). NeedToDownloadQueue и FinishedDownloadingQueue. Оба могут быть BlockingCollection. Добавьте элементы в первую очередь. Имейте выделенный поток, который читает из очереди один за другим и инициирует загрузку. Как только они будут выполнены, добавьте записи во вторую очередь.

mjwills 09.04.2019 09:10

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

Magnus 09.04.2019 09:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
167
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

}

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

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

я хочу вызвать одну из функций (startdowloaind) WebDownloader до дека

Muhammad Faizan Khan 09.04.2019 09:01

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

Mahmoud-Abdelslam 09.04.2019 09:09

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

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

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

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

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

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

Muhammad Faizan Khan 09.04.2019 09:01

Другие вопросы по теме