|
7 / 7 / 4
Регистрация: 25.03.2013
Сообщений: 117
|
|
.NET 4.x Потокобезопасно изменить коллекцию08.01.2014, 17:26. Показов 4847. Ответов 62
Метки нет (Все метки)
Коллекция прибиндина (binding) к listbox-у на вьюшке. Данные из коллекции (статус) обновляются из интернета, что может происходить долго и для того, чтобы интерфейс не завис - все делаю в асинхронном методе. Проблема в том, что во время обновления юзверь может удалить или добавить в коллекцию items.
Попробывал заблочить клавиши "добавить" и "удалить" пока обновляется список, но беда - долго обновляться может а у юзверей нету терпения, и возможность удалять и добавлять в коллекцию данные во время ее обновления надо. То как потокобезопасно изменять коллекцию? Добавлено через 2 часа 30 минут Есть предложения?) ТК я в тупике)
0
|
|
| 08.01.2014, 17:26 | |
|
Ответы с готовыми решениями:
62
|
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
|||
| 10.01.2014, 12:07 | |||
|
0
|
|||
| 10.01.2014, 12:15 | ||
|
0
|
||
|
burning1ife
|
||||||
| 10.01.2014, 12:49 | ||||||
|
ViewModel:
0
|
||||||
|
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
|
|||
| 10.01.2014, 13:22 | |||
![]() И как
0
|
|||
| 10.01.2014, 13:29 | ||
|
0
|
||
|
Master of Orion
|
||||||||||||||||
| 10.01.2014, 17:24 | ||||||||||||||||
|
Разрулю: функции модели в случае ошибки обязаны бросать исключение. Что делать с этим исключением - решать будет GUI. Если у нас есть метод Hello, ( Потокобезопасно изменить коллекцию ), и он может свалиться, он не должен try catch'ить и возвращать какие-то флаги, а должен упасть с исключением, а гуй должен оборачивать это в try catch и уже реагировать так, как ему хочется. Если вызывается что-то в тысяче мест, try catch ли, еще что-то ли, то есть такая классная штука, как Extract Method.
После этого в коде вместо
Добавлено через 1 минуту Если уж совсем невмоготу, то можно объявить один глобальный хандлер для исключений, который будет обрабатывать все и без try catch.
0
|
||||||||||||||||
| 10.01.2014, 17:27 | ||||||||
|
Psilon, спасибо.
2. Опять же из вашего примера GUI не обрабатывает исключения, это делает менеджер, заглушка, называйте как хотите. Я бы сделал так и не парился, как говорится и волки сыты и овцы целы
0
|
||||||||
|
Master of Orion
|
||||||||||||||
| 10.01.2014, 17:38 | ||||||||||||||
Добавлено через 4 минуты Grishaco, и расскажите о use case'ах такого метода?
Добавлено через 3 минуты
0
|
||||||||||||||
| 10.01.2014, 18:03 | |||||||
|
Вот пример use case Кликните здесь для просмотра всего текста
Нет никаких try-catch
0
|
|||||||
|
Master of Orion
|
|
| 10.01.2014, 18:29 | |
|
Grishaco, так можно и весь throw убрать, нафиг он тогда нужен, если данные всегда валидируются? Всегда считал защитное программирование усложняющей код фигней, без которой легко обойтись. У вас для каждого класса тогда нужен класс-прокладка, который будет валидировать все входные данные. И что получаем? А получаем удвоение количества кода, при этом никто не гарантирует, что Hello не будет вызван еще кем-то (вы же код пишете не один , ваш коллега вполне может не знать о ваших предпочтениях), вызовет Hello с null'ом и получит исключение. Почешит репу, да и добавит try catch. Тем более, что фактически вместо класса Hello у вас косячный класс Test. Еще раз: модель в случае некорректных данных должна бросать исключения, булевские функции Validate и Check должны носить исключительно характер private/protected или отсутствовать вовсе!
Пример: что если у нас есть метод MainMethod, в котором вызывается метод класса Test3, в котором вызывается метод класса Test2, в котором вызывается метод класса Test - Validate. Пусть у нас некорректные данные и произошла ошибка. MainMethod хочет в случае ошибки что-то сделать. Вопрос: как вы будете пробрасывать через всю эту архитектуру ошибку? В случае исключений ничего делать не надо - исключение само пробрасывается вверх по стеку, пока не найдет хандлер. Ну ладно, допустим, мы сделали return'ы и булевский флаг прокинули вверх. А тут прикол, кроме строки ошибки нужно вывести еще специальный GUID ошибки. Добавляем новое поле out для Test. Перестает работать Test2. Окей, туда тоже добавляем это поле. Перестает работать Test3. Е-мое, добавляем и туда. Теперь не работает MainMethod - не существует перегрузки метода Validate, которая принимает число аргументов (1). Блин, ну ладно, добавили еще одно поле. Чувствуете, какая веселая связность получается? Добавлено через 2 минуты P.S. Исключения в языке как раз призваны убрать все эти методы Check и Validate, сделать проверку ошибок более наглядной без тонн If (Check(a,b,c) && Validate(a,d,e)), и ими нужно пользоваться, а не "ой, я тут лучше утрою число кода и сделаю все с помощью логики, зато нету try catch, какой я молодец". У вас все выглядит типа неплохо, только потому, что у вас исключения нигде не обрабатываются. То есть оно может быть вызвано, но это нигде не обрабатывается. Такие дела.
0
|
|
| 10.01.2014, 18:41 | ||||||
|
Прогер пишет, тестер тестирует находит все баги, которые были пойманы глобальным обработчиком, сливает прогеру, он в свою очередь исправляет всю валидацию. Все профит, какие бы данные не ввел пользователь он об этом узнает и они всегда валидны без try-catch в коде. А вот если допустить такой вариант, что используются try-catch, тогда получается, что глатаются все исключения (или вы всегда в catch пишите конкретное исключение?). Добавлено через 2 минуты
0
|
||||||
|
Master of Orion
|
|||
| 10.01.2014, 19:27 | |||
|
Grishaco, я не спорю, что есть практика, когда есть валидирующий слой, который проверяет все входные данные, и если они корректные, передает их далее в систему, но я считаю это неправильным, потому что
Не по теме:
Добавлено через 2 минуты Grishaco, еще раз: такой подход практикуется, с прослойкой, но во-первых проповедовать его как едиинственный православный не надо, а во-вторых если он используется, то из внутреннего кода, который типа всегда работает с валидными данными убираются вообще все проверки. В принципе в этом и заключается смысл этого подхода, иначе получаем усложнение безо всякого профита. http://habrahabr.ru/post/191548/
0
|
|||
| 10.01.2014, 19:32 | ||||||||
|
Можно увидеть ваш вариант решения задачи с классом Hello и X, Y, Result?
0
|
||||||||
| 10.01.2014, 19:37 | |||||||
0
|
|||||||
| 10.01.2014, 19:52 | |||||||
|
Или это все таки будет такой вариант
1
|
|||||||
|
Master of Orion
|
||||||
| 10.01.2014, 20:59 | ||||||
|
Grishaco, что значит я прихожу к вашему варианту? Либо мы юзаем исключения, и имеем try catch, либо мы юзаем валидацию, тогда у нас в методе Hello не должно быть throw. А код выше это обычный Parse. TryParse на то и Try, что он глотает исключение. Но как он устроен?
0
|
||||||
| 10.01.2014, 21:17 | ||||||||||
Я не могу понять смысла кидать исключение и потом его ловить. Зачем объясните? Если заранее я знаю что null нельзя и будет исключение.
1
|
||||||||||
|
Master of Orion
|
|||
| 10.01.2014, 21:46 | |||
|
0
|
|||
| 10.01.2014, 21:46 | |
|
Помогаю со студенческими работами здесь
60
Отобразить коллекцию Реализовать коллекцию Отсортировать коллекцию
Объект в коллекцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|