Я сейчас пытаюсь отладить программу, которая запускается каждые 5 минут. Моя главная проблема - попытаться найти причину, по которой список stati c продолжает увеличиваться в размерах при каждом запуске моей программы. Цель состоит в том, чтобы сохранить этот список того же размера, но обновлять его элементы с различными значениями при каждом его выполнении.
Ниже приведен код класса, который выполняется каждые 5 минут, и установка значений для json сообщение, которое я отправляю на rabbitmq.
В методе PushJsonToBroker()
я обнаружил проблему увеличения размера compDataList
после каждого выполнения.
class Program
{
private static List<SimulatedData> compDataList = new List<SimulatedData>();
public static void Main(String[] args)
{
var autoEvent = new AutoResetEvent(false);
var stateTime = new Timer(SimulateData, autoEvent, 1000, 300000);
Console.ReadKey();
}
public static void SimulateData(object state)
{
Console.WriteLine("\n" + DateTime.Now + "\nSimulating Data...");
List<string> compValueList = new List<string>();
compValueList = ReadCompValueRow();
CompChannelValueMatching(compValueList);
PushJsonToBroker();
}
public static void CompChannelValueMatching(List<string> compValueList)
{
try
{
Console.WriteLine("Matching values with channels for Compressor...");
foreach(var c in compChannelListMongo)
{
string value;
string units;
string simTag;
string name;
var channelIndexMongo = compChannelListMongo.IndexOf(c);
if (c.Equals("C1"))
{
value = compValueList.ElementAt<string>(0);
units = compUnitListMongo.ElementAt<string>(channelIndexMongo);
simTag = compTagListMongo.ElementAt<string>(channelIndexMongo);
name = compNameListMongo.ElementAt<string>(channelIndexMongo);
decimal num, x;
if (decimal.TryParse(value, out x))
{
num = x;
}
else
{
num = 0;
}
SetCompValues(units, simTag, name, num);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public static void SetCompValues(string units, string simTag, string name, decimal num)
{
compDataList.Add(new SimulatedData { units = units, tag = simTag, name = name, value = num });
}
public static void PushJsonToBroker()
{
List<string> thingList = new List<string>();
List<string> assetTypeList = new List<string>();
Simulator.JsonProps data = new Simulator.JsonProps();
DateTime dateTime = DateTime.Now;
var dateValue = dateTime.ToString("yyyyMMddhhmmss.ffffff");
var demoThings = DBConnect.CosmosClient.GetCollection<BsonDocument>("Things");
foreach (var doc in demoThings.Find(x => x["_id"] != "").ToList())
{
thingList.Add(doc["_id"].ToString());
assetTypeList.Add(doc["AssetType"].ToString());
}
try
{
Console.WriteLine("\nCreating Json...");
foreach (var thingNo in thingList)
{
var thingIndex = thingList.IndexOf(thingNo);
var assetType = assetTypeList.ElementAt<string>(thingIndex);
if (assetType.Equals("HSE"))
{
data = new Simulator.JsonProps
{
machineId = thingNo,
trendValues = hseDataList.ToArray(),
messageId = dateValue + "@" + thingNo,
scheduleDate = DateTime.UtcNow
};
}
if(assetType.Equals("Spotlight_Comp"))
{
data = new Simulator.JsonProps
{
machineId = thingNo,
trendValues = compDataList.ToArray(), //problem is here!, every time the program runs the list grows in size instead of staying the same size each time it executes
messageId = dateValue + "@" + thingNo,
scheduleDate = DateTime.UtcNow
};
}
if(assetType.Equals("CPI"))
{
data = new Simulator.JsonProps
{
machineId = thingNo,
trendValues = cpiDataList.ToArray(),
messageId = dateValue + "@" + thingNo,
scheduleDate = DateTime.UtcNow
};
}
string jsonOutput = JsonConvert.SerializeObject(data, Formatting.Indented);
Console.WriteLine("Publishing JSON to broker for " + assetType);
switch (assetType)
{
case "Spotlight_Comp":
tcompChannel.BasicPublish(exchange: "DataEx",
routingKey: "",
basicProperties: null,
body: Encoding.UTF8.GetBytes(jsonOutput));
break;
case "HSE":
thseChannel.BasicPublish(exchange: "DataEx",
routingKey: "",
basicProperties: null,
body: Encoding.UTF8.GetBytes(jsonOutput));
break;
case "CPI":
tcpiChannel.BasicPublish(exchange: "DataEx",
routingKey: "",
basicProperties: null,
body: Encoding.UTF8.GetBytes(jsonOutput));
break;
}
Console.WriteLine("Done publishing...");
}
Console.WriteLine("Done sending data for all assets..." + "\nWaiting to run again...");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
Ниже приведен код класса, который получает значения это будет использоваться в сообщении json.
public class Simulator
{
public class JsonProps
{
public string machineId { get; set; }
public SimulatedData[] trendValues { get; set; }
public string messageId { get; set; }
public DateTime scheduleDate { get; set; }
}
public class SimulatedData
{
public decimal value { get; set; }
public string units { get; set; }
public string tag { get; set; }
public string name { get; set; }
}
}
Я не уверен, связана ли проблема со списком stati c или нет. Но этот вопрос поставил меня в тупик, если честно. Если у кого-то есть какие-либо входные данные или рекомендации о том, как запустить эту программу и сохранить список того же размера, но с разными значениями после каждого выполнения, это мне очень поможет!