Список Stati c C# продолжает увеличиваться в размере после каждой итерации - PullRequest
0 голосов
/ 06 января 2020

Я сейчас пытаюсь отладить программу, которая запускается каждые 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 или нет. Но этот вопрос поставил меня в тупик, если честно. Если у кого-то есть какие-либо входные данные или рекомендации о том, как запустить эту программу и сохранить список того же размера, но с разными значениями после каждого выполнения, это мне очень поможет!

1 Ответ

1 голос
/ 07 января 2020

После получения массива очистить список

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
};
compDataList.Clear(); //add this to resolve your Problem
...