|
7 / 7 / 4
Регистрация: 25.03.2013
Сообщений: 117
|
|
.NET 4.x Потокобезопасно изменить коллекцию08.01.2014, 17:26. Показов 4901. Ответов 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 | |
|
Отобразить коллекцию Реализовать коллекцию Отсортировать коллекцию
Объект в коллекцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|