Неожиданные результаты с присвоением значения в цикле foreach - sharpsnmplib - PullRequest
0 голосов
/ 16 ноября 2018

Я ищу объяснение следующей проблемы: я использую sharpsnmplib для связи с устройствами в сети.Если я присваиваю результат «внешней» переменной, то результат метода Messenger.Walk содержит ноль элементов, если я присваиваю результаты внутри метода и возвращаю его, тогда метод имеет правильные результаты.

Я чувствую, что скучаю по чему-то очень очевидному, но не могу найти это. Что делает это более интересным, так это то, что следующий плохой код "работает" в 200 сетях, но имеет проблемы с некоторыми устройствами в конкретной сети.

Обновление :Я забыл это: Messenger.Walk sharpsnmplib принимает список в качестве аргумента и добавляет его результаты к нему.https://github.com/lextm/sharpsnmplib/blob/038a3a0272f688075f573490721194e40cd56e3f/SharpSnmpLib/Messaging/Messenger.cs#L689

«Ненадежный код»:

        foreach (var item in devices.ToList())
        {
            try
            {
                List<Variable> res = new List<Variable>();

                BadMethod(item, res);
                logger.Debug(item.ipAddress + " count: " + res.Count);
            }

            catch (Exception er)
            {
                logger.Info("SNMP request error: " + er.Message);
                continue;
            }
        }

        private static int BadMethod(device devicesItem, List<Variable> res)
        {
            if (devicesItem.deviceType.snmpVersion == 1)
            {
                Messenger.Walk(VersionCode.V1,
                            new IPEndPoint(IPAddress.Parse(devicesItem.ipAddress), 161),
                            new OctetString(Properties.Test.Default.community),
                            new ObjectIdentifier("1.3.6.1.2.1.2.2.1.6"),
                            res,
                            14000,
                            WalkMode.WithinSubtree);
            }
            else if (devicesItem.deviceType.snmpVersion == 2)
            {
                Messenger.BulkWalk(VersionCode.V2,
                                new IPEndPoint(IPAddress.Parse(devicesItem.ipAddress), 161),
                                new OctetString(Properties.Test.Default.community),
                                new ObjectIdentifier("1.3.6.1.2.1.2.2.1.6"),
                                res,
                                14000,
                                1,
                                WalkMode.WithinSubtree,
                                null,
                                null);
            }
        }

Код, который работает:

        foreach (var item in devices.ToList())
        {
            try
            {
                var res = GoodMethod(item);
                logger.Debug(item.ipAddress + " count: " + res.Count);
            }

            catch (Exception er)
            {
                logger.Info("SNMP request error: " + er.Message);
                continue;
            }
        }

        private static List<Variable> GoodMethod(device devicesItem)
        {
            List<Variable> res = new List<Variable>();
            if (devicesItem.deviceType.snmpVersion == 1)
            {
                Messenger.Walk(VersionCode.V1,
                            new IPEndPoint(IPAddress.Parse(devicesItem.ipAddress), 161),
                            new OctetString(Properties.Test.Default.community),
                            new ObjectIdentifier("1.3.6.1.2.1.2.2.1.6"),
                            res,
                            14000,
                            WalkMode.WithinSubtree);
            }
            else if (devicesItem.deviceType.snmpVersion == 2)
            {
                Messenger.BulkWalk(VersionCode.V2,
                                new IPEndPoint(IPAddress.Parse(devicesItem.ipAddress), 161),
                                new OctetString(Properties.Test.Default.community),
                                new ObjectIdentifier("1.3.6.1.2.1.2.2.1.6"),
                                res,
                                14000,
                                1,
                                WalkMode.WithinSubtree,
                                null,
                                null);
            }

            return res;
        }
...