@Satangelus

Как ограничить одновременное количество выполняемых задач?

Есть один чудный сайт, скрипт поиска которого ищет данные только за один день.
Написал программку которая автоматизирует процесс, но оказалась есть очень большая проблема. Если одновременное количество сессий с одного ip превышает некоторое количество сервер начинает возвращать 503.

1. Как ограничить одновременное количество выполняемых тасков?
2. При выполнении Task.WhenAll(tasks.ToArray()); блокируется ui-поток,и форма заглушка-информатор которую я показываю на время поиска нормально не отрисовывается.
Как бороться с блокировкой, хочется на время поиска показывать нормальный информатор.

public static async Task ProcessUrlLawAsync(String Урл)
        {
            try
            {
                using (var webClient = new WebClient())
                {
                    string data = await webClient.DownloadStringTaskAsync(new Uri(Урл));
                    // run checks here.. 
                    Парсинг(data);
                }
            }
            catch (Exception ex)
            {
                //Catch my error here and handle it (display message box)
                log.Error("Не удалось скачать  ссылку="+Урл, ex);
            }
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            var tasks = new List<Task>();
            for (DateTime date = полеДатаС.Value.Date; date.Date <= полеДатаПо.Value.Date; date = date.AddDays(1))
            {
                foreach(var текСтрока in СписокУрл)
                {
                    Task fooWrappedInTask = Task.Run(() => ProcessUrlLawAsync(текСтрока) );
                    tasks.Add(fooWrappedInTask);
                }
            }
            await Task.WhenAll(tasks.ToArray());
        }
  • Вопрос задан
  • 131 просмотр
Пригласить эксперта
Ответы на вопрос 1
1. Как ограничить одновременное количество выполняемых тасков?

Считать кол-во уже запущенных, излишек складывать в очередь, как только выполнение какой-то задачи закончилось - брать из очереди следующую и выполнять.
2. При выполнении Task.WhenAll(tasks.ToArray()); блокируется ui-поток,и форма заглушка-информатор которую я показываю на время поиска нормально не отрисовывается.

Выполняйте Task.WhenAll(tasks.ToArray()); в другом потоке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы