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

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

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

Добрый день! Пожалуйста, подскажите, почему данный код не работает? Запустив метод CreateTimer(n) я хочу создать отдельный поток, в котором будет тикать таймер и через каждые n секунд удаляет из указанной папки файлы. Как запустить таймер в отдельном потоке на WCF?
public void CreateTimer(int seconds)
        {
            Task.Factory.StartNew(() =>
            {
                DispatcherTimer t = new DispatcherTimer();
                t.Tick += dispatcherTimer_Tick;
                t.Interval = TimeSpan.FromSeconds(seconds);
                t.Start();
            });
        }
        private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            DelFile();
        }
 
        private void DelFile()
        {
            FileInfo f;
            var files = Directory.GetFiles(@"C:\123", "*.bmp", SearchOption.TopDirectoryOnly);
            Parallel.For(0, files.Count(), (i) =>
            {
                f = new FileInfo(files[i]);
                f.Delete();
            });
        }
Проблему решил поменяв класс DispatcherTimer на System.Timers.Timer:
System.Timers.Timer t = new System.Timers.Timer();
                t.Elapsed += dispatcherTimer_Tick;
                t.Interval = Seconds;
                t.Start();

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

textual
Листинг программы
System.Timers.Timer deleteFilesTimer;
 
public void CreateTimer(int seconds)
{
    if (deleteFilesTimer == null)
    {
        deleteFilesTimer = new System.Timers.Timer();
        deleteFilesTimer.AutoReset = false; // Чтобы операции удаления не перекрывались
        deleteFilesTimer.Interval = seconds * 1000;
        deleteFilesTimer.Elapsed += OnDeleteFilesTimerElapsed;
        deleteFilesTimer.Enabled = true;
        deleteFilesTimer.Start();
    }
}
 
private void OnDeleteFilesTimerElapsed(object source, System.Timers.ElapsedEventArgs e)
{
    try
    {
        foreach (string fileName in Directory.EnumerateFiles(@"C:\123", "*.bmp"))
        {
            try { File.Delete(fileName); }
            catch () { }
        }
    }
    finally
    {
        deleteFilesTimer.Enabled = true;
    }
}

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


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

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

14   голосов , оценка 3.5 из 5
Похожие ответы