Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2015, 09:53   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Откуда взялся null

Здравствуйте.
Есть вот такой вот код:

Код:
List<Command> CommandsQueue = new List<Command>();

...

List<Command> exists = CommandsQueue.FindAll(item => item.CmdType == CommandTypes.GetState);
Переодически поиск вызывает Exception с указанием что item не определен. В отладчике он и правда нулл. Хотя список содержит нормальные здоровые объекты.
С чем это может быть связано?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 02.09.2015, 09:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может чушь сморожу, но среди свойств Command нет свойства с именем item?
И кстати как периодически? Не постоянно? уловить ситуацию с эксцепшном получается?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2015, 10:00   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Код:
internal class Command
    {
        /// <summary>
        /// Получает понятное имя команды
        /// </summary>
        public CommandTypes CmdType
        {
            get
            {
                if (CmdData == null) return CommandTypes.None;
                return (CommandTypes)CmdData[2];
            }
        }

        /// <summary>
        /// Команда
        /// </summary>
        public byte[] CmdData
        {
            get;
            protected set;
        }

        /// <summary>
        /// Данные
        /// </summary>
        public byte[] Data
        {
            get;
            protected set;
        }

        /// <summary>
        /// Получает готовый пакет для отправки
        /// </summary>
        public byte[] PackedData
        {
            get
            {
                List<byte> _comp = new List<byte>();
                _comp.AddRange(CmdData);
                _comp.AddRange(Data);
                return _comp.ToArray();
            }
        }

        public Command(CommandTypes cmdType, byte[] SendData)
        {
            CmdData = new byte[] { 0x00, 0x00, (byte)cmdType };
            Data = SendData == null ? new byte[] { } : SendData;
        }
    }
Вот класс.
Вылетает эксепшн достаточно редко. Технически можно и отладчиком поймать. Но когда ловил то список содержал в себе несколько объектов нормальных. Если после отлова перевести указатель на туже строку то уже выполняется нормально ...
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 02.09.2015, 10:03   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так в отладчике точно нет null в списке?

А если Where вместо FindAll? Тем более, что он должен быть лучше по производительности если не требуется именно List получить (если не вызывать ToList).

Со списком только 1 поток работает? Если нет, то может что-то не так с синхронизацией?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 02.09.2015 в 10:07.
Alex11223 вне форума Ответить с цитированием
Старый 02.09.2015, 10:22   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Скорее всего действительно что-то вмешивается в список и чистит его элементы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2015, 10:30   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так в отладчике точно нет null в списке?
Точно нету.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А если Where вместо FindAll?
Вообще мне нужно просто узнать содержит ли список команду с указанным типом или нет. Производительность особо не имеет значения. Но если есть более изящное решение чем у меня то буду рад увидеть его.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Со списком только 1 поток работает? Если нет, то может что-то не так с синхронизацией?
Постановка команды в список может быть вызвана и в других потоках.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Скорее всего действительно что-то вмешивается в список и чистит его элементы.
А удаление происходит в той же самой функции.


Попробую залочить объект. Только вот как лучше? перед добавлением или перед удалением блокировать?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 02.09.2015, 10:34   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Вообще мне нужно просто узнать содержит ли список команду с указанным типом или нет. Производительность особо не имеет значения. Но если есть более изящное решение чем у меня то буду рад увидеть его.
LINQ
Код:
bool exists = CommandsQueue.Any(item => item.CmdType == CommandTypes.GetState);
Еще есть FirstOrDefault если нужно и получить его (один).
Цитата:
Попробую залочить объект. Только вот как лучше? перед добавлением или перед удалением блокировать?
Разве не в обоих случаях надо? Ну точнее при любом доступе, иначе толку от лока на добавление/удаление если в том коде, о котором тут речь, не будет лока?

Еще есть стандартные потокобезопасные коллекци
https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx
ConcurrentQueue может быть подойдет, раз уж в имени переменной есть слово Queue.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 02.09.2015 в 10:41.
Alex11223 вне форума Ответить с цитированием
Старый 02.09.2015, 10:51   #8
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
ConcurrentQueue может быть подойдет, раз уж в имени переменной есть слово Queue.
Не работал с такими еще .. щас посмотрим ...
Спасибо.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
уголок на рабочем столе. откуда взялся kzld Windows 3 03.04.2015 10:01
Откуда ошибка? Praud Помощь студентам 2 03.01.2015 18:53
Откуда пробел? waxjey PHP 2 12.10.2014 18:47
Откуда нуль?? FrozenHurt Общие вопросы C/C++ 2 21.01.2012 22:04