.NET 4.x Запустить таймер в отдельном потоке - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Пожалуйста, подскажите, почему данный код не работает? Запустив метод CreateTimer(n) я хочу создать отдельный поток, в котором будет тикать таймер и через каждые n секунд удаляет из указанной папки файлы. Как запустить таймер в отдельном потоке на WCF?
Листинг программы
  1. public void CreateTimer(int seconds)
  2. {
  3. Task.Factory.StartNew(() =>
  4. {
  5. DispatcherTimer t = new DispatcherTimer();
  6. t.Tick += dispatcherTimer_Tick;
  7. t.Interval = TimeSpan.FromSeconds(seconds);
  8. t.Start();
  9. });
  10. }
  11. private void dispatcherTimer_Tick(object sender, EventArgs e)
  12. {
  13. DelFile();
  14. }
  15. private void DelFile()
  16. {
  17. FileInfo f;
  18. var files = Directory.GetFiles(@"C:\123", "*.bmp", SearchOption.TopDirectoryOnly);
  19. Parallel.For(0, files.Count(), (i) =>
  20. {
  21. f = new FileInfo(files[i]);
  22. f.Delete();
  23. });
  24. }
Проблему решил поменяв класс DispatcherTimer на System.Timers.Timer:
Листинг программы
  1. System.Timers.Timer t = new System.Timers.Timer();
  2. t.Elapsed += dispatcherTimer_Tick;
  3. t.Interval = Seconds;
  4. t.Start();

Решение задачи: «.NET 4.x Запустить таймер в отдельном потоке»

textual
Листинг программы
  1. System.Timers.Timer deleteFilesTimer;
  2.  
  3. public void CreateTimer(int seconds)
  4. {
  5.     if (deleteFilesTimer == null)
  6.     {
  7.         deleteFilesTimer = new System.Timers.Timer();
  8.         deleteFilesTimer.AutoReset = false; // Чтобы операции удаления не перекрывались
  9.         deleteFilesTimer.Interval = seconds * 1000;
  10.         deleteFilesTimer.Elapsed += OnDeleteFilesTimerElapsed;
  11.         deleteFilesTimer.Enabled = true;
  12.         deleteFilesTimer.Start();
  13.     }
  14. }
  15.  
  16. private void OnDeleteFilesTimerElapsed(object source, System.Timers.ElapsedEventArgs e)
  17. {
  18.     try
  19.     {
  20.         foreach (string fileName in Directory.EnumerateFiles(@"C:\123", "*.bmp"))
  21.         {
  22.             try { File.Delete(fileName); }
  23.             catch () { }
  24.         }
  25.     }
  26.     finally
  27.     {
  28.         deleteFilesTimer.Enabled = true;
  29.     }
  30. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы