Запускаю одновременно несколько тасков:
using (semaphore = new SemaphoreSlim(maxConcurrency))
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < MyCollection.Count; i++)
{
int id = i;
await semaphore.WaitAsync();
tasks.Add(Task.Run(() =>
{
progress.Report("Автопостинг, канал : " + id);
AddPost(progress, id, semaphore, false);
}));
}
StatusWork = true;
await Task.WhenAll(tasks);
}
Метод AddPost() выглядит примерно вот так:
public async void AddPost(IProgress<string> progress, int ChanelNubmer, SemaphoreSlim semaphore, bool IndividualStartCheck)
{
for (; ; )
{
// Полезная нагрузка
Task.Delay(200000);
if (Stop == true)
{
progress.Report("Поток " + ChanelNubmer + " остановлен!");
MyCollection[ChanelNubmer].Status = "Не работает";
return;
}
}
}
Метод выполняет определенную работу, затем ждет 200000 миллисекунд и повторяет действие заново.
Если нужно остановить работу метода - нажатием кнопки на форме я присваиваю логической переменной Stop значение true
Проблема в том что используя Task.Delay(200000); - цикл будет остановлен не сразу.
Как в данном случае можно остановить работу метода моментально?
И метод AddPost я запускаю одновременно в нескольких потоках, если присвоить Stop == true - остановятся все потоки, можно как то обратиться к определенному потоку что бы остановить только его?
Task.Delay(200000);вот здесь вы забыли проawait. У вас приложение не виснет от запуска кучиDelayв секунду, случаем? Да иsemaphore.Release()вы забыли вызывать при завершении операции. – aepot Apr 21 '21 at 16:56