[英]Count the type of tasks executed by a windows service c#
我有使用c#开发的Windows服务。 该服务一直在寻找特定的文件夹路径(例如inputfolder
,如果添加了任何新的文本文件,它将拾取该文件,对其进行处理并生成输出,并将其写入另一个日志文件,然后从inputfolder
删除该文件。
现在, inputfolder
的数据可以是不同的类型,例如TypeA
和TypeB
。 在读取文本文件中的数据后,便知道此类型。 每个文件都有TypeA
或TypeB
而不是两者都有。我能够读取txt文件并获取文件类型。
我的要求是一天结束后,我应该能够知道已经运行了多少TypeA
任务以及已经运行了多少TypeB
任务,因此,我正在考虑执行以下操作之一:
声明一个静态变量,例如在应用程序中声明countA
和countB
,并在获得类型后立即增加适当的变量。 但是,如果由于某种原因,必须在一天之间停止并启动该服务,我将丢失数据。
将这些详细信息写入单独的文件(例如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.