Aplikacja konsolowa działająca w tle

0

Posiadam aplikację konsolową napisaną w c#. Odpalenie aplikacji powoduje odczytanie pliku tekstowego i dane z tego pliku są przetwarzane przez tą aplikację i zapisywane w bazie mssql.
Plik pojawia się cyklicznie co jakiś czas.
Chciał bym zrobić tak aby ten program raz odpalony działał cały czas i sam sprawdzał co zadany interwał czasu czy pojawił się plik. Jeśli tak to ma wczytać go, dane zapisać do bazy i przenieść zaimportowany plik do wskazanego folderu.
Kompletnie nie wiem jak się zabrać za to "ciągłe działanie programu" oraz cykliczne sprawdzanie czy pojawił się plik i jeśli pojawił to ma wywołać funkcję która wczyta dane z pliku do bazy.
Jak to ugryźć ?

2

Od tego są Windows Services. Dla łatwego pisania ich i instalowania proponuję użyć dodatek Topshelf: http://topshelf-project.com/ Twój serwis będzie działał w tle, i uruchamiał się przy starcie systemu (chyba że ustawiasz inaczej).

0

Użyj timera

using System;
using System.Timers;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var timer = new Timer(1000);
            timer.Elapsed += Timer_Elapsed;
            timer.Start();
            Console.ReadKey();
        }

        private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("operacja wykonywana cyklicznie");
        }
    }
}

1

Może zamiast timera użyć czegoś takiego: https://docs.microsoft.com/pl-pl/dotnet/api/system.io.filesystemwatcher

3

Zamiast cyklicznie sprawdzać, czy coś się zmieniło, czy nie lepiej kazać systemowi nas informować o zmianach?

Sam pewien czas temu robiłem aplikację monitorującą zmiany na dysku. Było to w Pascalu, więc kodem się nie podzielę, ale mogę wskazać drogę. Główną atrakcja była funkcja WinAPI ReadDirectoryChangesW - https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw

0

Dziękuję bardzo za podpowiedzi i nakierowanie.
Pozdrawiam

0

Znalezione na szybko

public void CreateFileWatcher(string path)
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = path;
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
       | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.Filter = "*.txt";
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.EnableRaisingEvents = true;
}

private static void OnChanged(object source, FileSystemEventArgs e)
{
   Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
}

Jeżeli program ma działać w tle to możesz użyć WinApi aby schować okno konsoli lub po prostu w ustawieniach projektu zmienić typ na aplikację okienkową.

1 użytkowników online, w tym zalogowanych: 0, gości: 1