NikolayKhablenko, У вас вопрос "Как мгновенно завершить Task" и Task.Sleep(30) просто заблокирует поток, ему ядро не будет выделять кванты времени. И из других потоков вы не сможете в этот момент повлять.
Вместо Task.Sleep можно применить и ManualResetEvent и ждать на нем теже 30 мс. Но уже при таком решении из других потоков этот event можно перевести в сигнальное состояние и при его наличии завершить задачу.
В вашей задаче Task.Sleep(30) не сильно критично, вы просто используете поток пока не выполните задачу, но вот в ответе вам написали иной сценарий, при котором может быть запущено одновременно множество тасков в своих потоках, что приведет к проблемам производительности.
Алексей Березников, SemaphoreSlim не применяет обьекты ядра windows и его Release не проверяет каким потоком был захвачен семафор. Поэтому его и можно использовать. Все что использует обьекты ядра windows тут нежелательно, а то может возникнуть интересная ситуация в случае если код таска будет таким (как вы указали в ответе):
Алексей Березников, У вас поток Task-а будет на _semaphore.WaitOne(); заблокирован, пока захваченый семафор не будет освобожден. А так как Task-и запускаются в пуле потоков, а в .net пул потоков ограничен максимум 1000 потоков, то в определенные моменты это может привести к снижению производительности приложения, то есть в точности как и использование Thread.Sleep
Очень плохой подход помещать обьекты синхронизации, как в вашем случае Semaphore, в тело Task-а.
Также и у автора вопроса System.Threading.Thread.Sleep(30);
Иван, Вот в этом и проблема для работодателей, что все хотят развиваться за его счет на работе, а не работать..
И можете подробнее рассказать, как это заниматься семьей? Вот есть у меня семья, есть дети, есть хозяйство с животными, но что-то это не сильно много и времени занимает. Может что-то не так делаю? ))
Георгий Кузнецов, Таймер нужно реализовывать не через итерацию переменной, а через разницу во времени. Сохраняете время начала работы таймера и при отрисовке вычитайте от текущего времени, замедления не будет
У вас очень абстрактное задание и от этого все проблемы, определите более точно, что должно происходить.
Что значит "открыть html страницу"? Открыть ее для просмотра в браузере, в окне просмотра самого приложения или как файл данных для изменения.
Student2002, Если у вас одна строка одним потоком обрабатывается 1-3 минуты, то это не значит, что 100 потоков выполнят 100 строк за это время. У вас скорее всего ядер не хватит на параллельную обработку такого кол-ва потоков.
По коду:
Примените для примера ConcurrentQueue и выбирайте потоками из него построчно, а в отдельном потоке загружайте туда строки, что должны быть обработаны
32х битное приложение ограничено по памяти в 2GB. Так что сколько не создавайте потоков этот лимит не преодалеть.
Меняйте логику приложения, чтобы не хранить в памяти такой обьем данных или компилите 64битную версию
Так запустите свой импорт в отдельном потоке, а пользователю верните Ok.
Если нужно отслеживание.,то верните ID действия и другими запросами с передачей данного ID отслеживайте статус.
Вместо Task.Sleep можно применить и ManualResetEvent и ждать на нем теже 30 мс. Но уже при таком решении из других потоков этот event можно перевести в сигнальное состояние и при его наличии завершить задачу.
В вашей задаче Task.Sleep(30) не сильно критично, вы просто используете поток пока не выполните задачу, но вот в ответе вам написали иной сценарий, при котором может быть запущено одновременно множество тасков в своих потоках, что приведет к проблемам производительности.