计算Windows服务执行的任务类型c#

问题描述 投票:0回答:2

我有一个使用c#开发的Windows服务。此服务一直在查看特定的文件夹路径,例如inputfolder,如果添加了任何新文本文件,它会获取文件,处理它并生成输出并将其写入另一个日志文件并从inputfolder中删除该文件。

现在,inputfolder中的数据可以是不同类型的,例如TypeATypeB。读取文本文件中的数据后,此类型是已知的。每个文件都有TypeATypeB而不是两者。我能够读取txt文件并获取文件类型。

我的要求是在一天结束时,我应该能够知道有多少TypeA任务已经运行以及有多少TypeB任务已经运行。所以为此我正在考虑做以下其中一项:

  1. 在应用程序中声明一个静态变量,比如countAcountB,一旦我得到类型,就增加相应的变量。但如果由于某种原因,服务必须在一天之间停止并启动,我将丢失数据。
  2. 将这些详细信息写入单独的文件,例如txt或日志文件。首先读取文件,获取现有计数,递增计数并再次覆盖新值。

任何人都可以建议,这是最好的方法。如果有人认为上述方法是非常粗暴的做法,请指导/建议我更好的方法。

提前谢谢了!

c# static windows-services
2个回答
0
投票

正如你所说,这取决于你的要求。如果计数器值很重要,那么很可能因服务中的任何故障而丢失主题,您应该在本地存储最新的计数器值。

对于存储计数器值的方式和位置的场景,有多种选择:

  • 将计数器存储在磁盘上并保持文件最新状态
  • 将计数器存储在注册表项中

您的代码应该是这样的:

 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;
        }
    }

1
投票

  • 将其存储在内存中,并在数据发生变化时将数据保存到文件或注册表中。
  • 或者将其存储在数据库中,相同,或创建一个包含任务和开始日期的表。您可以通过各种方式查询它

当服务加载读取该数据时,将其存储在内存中。

任务完成

© www.soinside.com 2019 - 2024. All rights reserved.