繁体   English   中英

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

[英]Count the type of tasks executed by a windows service c#

我有使用c#开发的Windows服务。 该服务一直在寻找特定的文件夹路径(例如inputfolder ,如果添加了任何新的文本文件,它将拾取该文件,对其进行处理并生成输出,并将其写入另一个日志文件,然后从inputfolder删除该文件。

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

我的要求是一天结束后,我应该能够知道已经运行了多少TypeA任务以及已经运行了多少TypeB任务,因此,我正在考虑执行以下操作之一:

  1. 声明一个静态变量,例如在应用程序中声明countAcountB ,并在获得类型后立即增加适当的变量。 但是,如果由于某种原因,必须在一天之间停止并启动该服务,我将丢失数据。

  2. 将这些详细信息写入单独的文件(例如txt或日志文件)中。 首先读取文件,获取现有计数,对其进行递增,然后再次覆盖新值。

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

提前谢谢了!

  • 将其存储在内存中,并在数据更改时将数据持久保存到文件或注册表中。
  • 或将其存储在相同的数据库中,或创建带有任务和开始日期的表。 您可以通过各种方式查询它

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

任务完成

正如您所说,这取决于您的要求。 如果计数器值很重要,则确实有可能由于服务故障而失去主题,因此您应该在本地存储最新的计数器值。

对于如何以及在何处存储计数器值的方案,有多种选择:

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

您的代码应如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM