#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. Используйте
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 я думаю, мы могли бы удалить очередь, затем вызвать функцию запуска загрузки, и если произойдет какая-либо ошибка, мы снова поставим в очередь, что вы думаете?