|
7 / 7 / 4
Регистрация: 25.03.2013
Сообщений: 117
|
|
.NET 4.x Потокобезопасно изменить коллекцию08.01.2014, 17:26. Показов 5061. Ответов 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 | |
|
Отобразить коллекцию Реализовать коллекцию Отсортировать коллекцию
Объект в коллекцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|