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 шт):
Не надо никаких 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 лучше забыть.