Если нужно делать это при запущенном приложении, то делай это с помощью
таймеров, а работу делать как в текущем потоке (например асинхронно) так и использовать ThreadPool
Если речь об организации запуска задачи вне запущенного приложения, то нужно использовать средства операционной системы, для windows это task scheduler, можно настраивать вручную а можно использовать командную строку или powershell или использовать старый COM Scheduler.Service (есть готовый NuGet пакет
Microsoft.Win32.TaskScheduler)