Выполните операцию до удаления из очереди в C # - PullRequest
1 голос
/ 09 апреля 2019

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

 public Queue<WebDownloader> webDownloaderQ;

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

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

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

     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.

РЕДАКТИРОВАТЬ:

Помните : Iхотите вызвать одну из функций (StartDowloaind) из WebDownloader перед тем, как вытеснить объект.

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

  1. сначала поставьте в очередь запрос на загрузку

  2. , затем проверьте, работает ли цикл загрузки или нет, если нет, инициируйте цикл

  3. Как только загрузка завершится, исключите запрос из очереди.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

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

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

С учетом вашего комментария:

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

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

0 голосов
/ 09 апреля 2019

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

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

}

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

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

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