|
7 / 7 / 4
Регистрация: 25.03.2013
Сообщений: 117
|
|
.NET 4.x Потокобезопасно изменить коллекцию08.01.2014, 17:26. Показов 4896. Ответов 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 | |
|
Отобразить коллекцию Реализовать коллекцию Отсортировать коллекцию
Объект в коллекцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
|
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
|
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения.
https:/ / habr. com/ ru/ sandbox/ 295048/
начало и оглавление
-
Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0)
Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона
Уважаемые коллеги!
В продолжение. . .
|
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии
Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
|