Я пытаюсь использовать WebClient для асинхронной загрузки нескольких файлов. Насколько я понимаю, это возможно, но вам нужно иметь один объект WebClient
для каждой загрузки. Так что я решил, что просто поставлю кучу их в очередь в начале моей программы, затем вытащу их по одному и скажу им загрузить файл. Когда файл загружается, они могут быть возвращены в очередь.
Толкать вещи в мою очередь не должно быть так уж плохо, мне просто нужно сделать что-то вроде:
lock(queue) {
queue.Enqueue(webClient);
}
Правильно? Но как насчет того, чтобы их сбросить? Я хочу, чтобы мой основной поток спал, когда очередь пуста (подождите, пока другой веб-клиент не будет готов, чтобы он мог начать следующую загрузку). Я полагаю, что мог бы использовать Semaphore
рядом с очередью, чтобы отслеживать, сколько элементов находится в очереди, и это при необходимости переводило бы мой поток в спящий режим, но это не похоже на очень хорошее решение. Что произойдет, если я забуду уменьшить/увеличить свой семафор каждый раз, когда я помещаю/извлекаю что-то из своей очереди, и они теряют синхронизацию? Это было бы плохо. Нет ли какого-нибудь хорошего способа, чтобы queue.Dequeue()
автоматически засыпал, пока не появится элемент, который нужно удалить из очереди, а затем продолжить?
Я также приветствовал бы решения, которые вообще не связаны с очередью. Я просто подумал, что очередь будет самым простым способом отслеживать, какие веб-клиенты готовы к использованию.