Task/Thread в цикле не работают

Мне нужно сделать так, чтобы в цикле 5 методов параллельно работали(они качают картинки)

Если я делаю цикл без Task/Thread все прекрасно работает, но не выполняет мою задачу. Если же я включаю в код Task/Thread, то цикл неведомым образом, сразу скачивает 5 элемент. P.S без тасков все четко работает. Вопрос, почему происходить данная ситуация?

Task:
for(int countfilms = 0; countfilms < 5; countfilms++)
{
      await Task.Factory.StartNew(async () =>
      {
          string namefilm = Regex.Replace(document.QuerySelectorAll("div.sect-cont.sect-items.clearfix div.th-title")[countfilms].TextContent, @"\s+", " ");
          string link = await Bing.CheckAndSend(namefilm, new ImageElement());
          TakePicture(DownloadPicture(in link, in countfilms));
      });
}
Thread:
for(int countfilms = 0; countfilms < 5; countfilms++) 
{
     new Thread(async() =>
     {
        string namefilm = Regex.Replace(document.QuerySelectorAll("div.sect-cont.sect-items.clearfix div.th-title")[countfilms].TextContent, @"\s+", " ");
        string link = await Bing.CheckAndSend(namefilm, new ImageElement());
        TakePicture(DownloadPicture(in link, in countfilms));
     }).Start();
}

TakePicture- Ивент(Делегат)


Ответы (1 шт):

Автор решения: aepot

Не надо никаких Task.Factory...и старайтесь не выполнять одну и ту же операцию в цикле, когда ее выполнить можно 1 раз.

Нужно например выполнить много запросов, но чтобы одновременно были активны только 5.

var nodes = document.QuerySelectorAll("div.sect-cont.sect-items.clearfix div.th-title");
using var semaphore = new SemaphoreSlim(5);
List<Task> tasks = new List<Task>();
for (int i = 0; i < nodes.Count; i++)
{
    await semaphore.WaitAsync();
    int id = i; // это исправляет проблему захвата счетчика цикла, чтобы не было 5 5 5 5 5
    tasks.Add(((Func<Task>)(async () =>
    {
        try
        {
            string namefilm = Regex.Replace(nodes[id].TextContent, @"\s+", " ");
            string link = await Bing.CheckAndSend(namefilm, new ImageElement());
            TakePicture(DownloadPicture(in link, in id)); // здесь сомнение, почему эти методы синхронные? Они очень быстро отрабатывают?
        }
        finally
        {
            semaphore.Release();
        }
    }))());
}
await Task.WhenAll(tasks);

Асинхронное программирование. При использовании асинхронного программирования про существование Thread лучше забыть.

→ Ссылка