Подсчитать тип задач, выполняемых службой Windows c # - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть служба Windows, разработанная с использованием C #. Эта служба продолжает искать путь к определенной папке, скажем, inputfolder, если добавлен какой-либо новый текстовый файл, он берет файл, обрабатывает его, генерирует вывод и записывает его в другой файл журнала и удаляет файл из * 1002. *.

Теперь данные в inputfolder могут быть разных типов, например, TypeA и TypeB. Этот тип известен после прочтения данных в текстовом файле. Каждый файл имеет либо TypeA, либо TypeB, но не оба. Я могу прочитать текстовый файл и получить тип файла.

Мое требование здесь - в конце дня, я должен быть в состоянии сказать, сколько задач TypeA запущено и сколько задач TypeB запущено. Поэтому для этого я думаю сделать одну из следующее:

  1. Объявите статические переменные, скажем, countA и countB в приложении, и, как только я получу тип, увеличим значение соответствующей переменной. Но если по какой-то причине служба должна быть остановлена ​​и запущена между днями, я потеряю данные.

  2. Запишите эти данные в отдельный файл, скажем, TXT или файл журнала. Сначала прочитайте файл, получите существующее количество, увеличьте его и снова перезапишите новое значение.

Может ли кто-нибудь предложить, что является лучшим способом сделать это. Если кто-то считает, что описанный выше метод является очень грубым, просим вас указать / предложить лучший способ сделать это.

Большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Как вы говорите, это зависит от ваших требований.если значение счетчика важно, действительно можно потерять тему из-за любой ошибки в обслуживании, и вы должны хранить последнее значение счетчика локально.

А для сценария того, как и где хранить значение счетчика, существует несколько вариантов:

  • Сохраните счетчик в файле на диске и обновите файл
  • Сохраните счетчик в ключе реестра

Ваш код должен выглядеть примерно так:

 public static void Main()
    {
        var result = IncCounter(@"D:\1.txt", FileType.TypeA);

        Console.WriteLine($"TypeA : {result.FileTypeACounter} - TypeB : {result.FileTypeBCounter}");

        Console.Read();
    }

    public enum FileType
    {
        TypeA,
        TypeB
    }

    [Serializable]
    public class FileTypeCounter
    {
        public int FileTypeACounter { get; set; }
        public int FileTypeBCounter { get; set; }
    }

    public static void WriteToBinaryFile<T>(string filePath, T objectToWrite, bool append = false)
    {
        using (Stream stream = File.Open(filePath, append ? FileMode.Append : FileMode.Create))
        {
            var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            binaryFormatter.Serialize(stream, objectToWrite);
        }
    }

    public static T ReadFromBinaryFile<T>(string filePath)
    {
        using (Stream stream = File.Open(filePath, FileMode.Open))
        {
            var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            return (T)binaryFormatter.Deserialize(stream);
        }
    }

    public static FileTypeCounter IncCounter(string counterFilePath, FileType fileType)
    {
        try
        {
            var fileTypeCounter = new FileTypeCounter { FileTypeACounter = 0, FileTypeBCounter = 0 };

            if (!File.Exists(counterFilePath))
            {
                if (fileType == FileType.TypeA)
                    fileTypeCounter.FileTypeACounter++;
                else
                    fileTypeCounter.FileTypeBCounter++;

                WriteToBinaryFile<FileTypeCounter>(counterFilePath, fileTypeCounter);
                return fileTypeCounter;
            }

            fileTypeCounter = ReadFromBinaryFile<FileTypeCounter>(counterFilePath);

            switch (fileType)
            {
                case FileType.TypeA:
                    fileTypeCounter.FileTypeACounter++;
                    break;

                case FileType.TypeB:
                    fileTypeCounter.FileTypeBCounter++;
                    break;
            }

            WriteToBinaryFile<FileTypeCounter>(counterFilePath, fileTypeCounter);

            return fileTypeCounter;
        }
        catch (Exception ex)
        {
            return null;
        }
    }
0 голосов
/ 11 сентября 2018

Либо

  • Сохраните их в памяти и сохраните данные в файле или реестре при их изменении.
  • Или сохраните их в той же базе данных или создайтетаблица с заданием и датой начала.Вы можете запросить его различными способами

Когда служба загружает чтение этих данных, сохраните их в памяти.

Работа выполнена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...