Есть несколько запросов на загрузку, которые я хочу обработать один за другим, и по этой причине я использую 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
перед удалением объекта из очереди.
Я хочу сначала поставить запрос в очередь, причина в том, что для загрузки каждого запроса потребуется некоторое время. Следовательно,
сначала поставьте запрос на загрузку
затем проверьте, запущен ли цикл загрузки, если нет, инициируйте петля
Когда конкретная загрузка завершает удаление запроса из очереди.
Можете быть более конкретными
Сделайте это вместо singleAbLoader.ElementAt(i)
, Queue<T> не предоставляет индексатор, потому что он реализует IEnumerable<T>
и IReadOnlyCollection<T>
@KunalMukherjee Не используйте ElementAt
, так как он должен повторять коллекцию каждый раз, когда вы ее вызываете.
@Magnus верно, что это будет доступ O(n)
, но все же рекомендуется вместо этого использовать цикл foreach
.
Дополнительная информация добавлена в вопрос, пожалуйста, проверьте.
@Magnus Я хочу сначала поставить в очередь, причина в том, что для загрузки каждого запроса потребуется некоторое время. поэтому сначала выполните enque, затем проверьте, работает ли цикл, если нет, инициируйте цикл.
Я добавил больше информации, включая шаги. Пожалуйста, проверьте.
Я бы посоветовал вам две очереди (или, что более вероятно, BlockingCollection
s). NeedToDownloadQueue
и FinishedDownloadingQueue
. Оба могут быть BlockingCollection
. Добавьте элементы в первую очередь. Имейте выделенный поток, который читает из очереди один за другим и инициирует загрузку. Как только они будут выполнены, добавьте записи во вторую очередь.
Я до сих пор не понимаю, почему вы не можете поставить его в очередь и начать загрузку одновременно... И подключить событие для обработки исключения из очереди после завершения загрузки.
пожалуйста, используйте метод удаления из очереди, чтобы открыть элемент, как показано ниже.
while (singleAbLoader.Count>0)
(
WebDownloader method= singleAbLoader.Dequeue();
method.StartDowloaind();
}
таким образом, даже если очередь будет увеличена, она будет продолжать использовать всплывающие окна и без необходимости в индексе.
Я также предлагаю использовать ConcurrentQueue
, если очередь будет использоваться несколькими потоками.
я хочу вызвать одну из функций (startdowloaind) WebDownloader до дека
@MuhammadFaizanKhan Я думаю, мы могли бы удалить очередь, а затем вызвать функцию начала загрузки, и если произойдет какая-либо ошибка, мы снова поставим в очередь, что вы думаете?
Вы можете использовать foreach
, чтобы просмотреть свою очередь. foreach
не удаляется из очереди
public void StartDownloading()
{
foreach(WebDownloader wd in singleAbLoader)
{
wd.Start();
}
}
Учитывая ваш комментарий:
Поскольку загрузки могут выполняться не в том порядке, в котором они начинаются, используйте List
вместо Queue.
В вашем классе WebDownloader
, очевидно, есть что-то вроде события DownloadCompleted
, вы можете удалить его из списка там. или, если вам это нужно, просто добавьте его в очередь завершенных загрузок.
Я не только хочу начать загрузку, но и хочу исключить ее из очереди, если конкретная загрузка завершена.
Вместо этого используйте
foreach
. Но кого вы просто не начинаете загрузку, когда ставите ее в очередь?