Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
7 / 7 / 4
Регистрация: 25.03.2013
Сообщений: 117
.NET 4.x

Потокобезопасно изменить коллекцию

08.01.2014, 17:26. Показов 4856. Ответов 62
Метки нет (Все метки)

Коллекция прибиндина (binding) к listbox-у на вьюшке. Данные из коллекции (статус) обновляются из интернета, что может происходить долго и для того, чтобы интерфейс не завис - все делаю в асинхронном методе. Проблема в том, что во время обновления юзверь может удалить или добавить в коллекцию items.
Попробывал заблочить клавиши "добавить" и "удалить" пока обновляется список, но беда - долго обновляться может а у юзверей нету терпения, и возможность удалять и добавлять в коллекцию данные во время ее обновления надо.
То как потокобезопасно изменять коллекцию?

Добавлено через 2 часа 30 минут
Есть предложения?) ТК я в тупике)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2014, 17:26
Ответы с готовыми решениями:

Изменить коллекцию в forEach
Задача: сделать uppercase всех слов, длина которых больше 3 символов. Как это сделать с помощью стрима? Мой набросок(значение элементов в...

Потокобезопасно ли одновременно добавлять в конец list обьекты и удалять из середины?
Добрый день. Потокобезопасно ли одновременно добавлять в конец list обьекты и удалять из середины? Есть два потока. Один парсит лист и...

Дано число R и коллекцию размера N. Преобразовать коллекцию, заменив все ее положительные элементы на число R
Всем доброго времени суток. Вот такая задачка. Дано число R и коллекция размера N. Преобразовать коллекцию, заменив все ее...

62
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
09.01.2014, 14:34
Цитата Сообщение от pycture Посмотреть сообщение
Если же воспользоваться ненавистным вам catch
Где я написал что я его ненавижу?

Я как раз писал, что не следует использовать try-catch, если не понимаешь алгоритма до конца, если брать ваш пример, его стоило было оформить так:

C#
1
2
3
4
5
6
int a = 1;
            int b = 0;
            if (b == 0)
                Console.WriteLine("При положении Луны в Стрельце, значение не может быть вычислено. Введите другое значение b");
            else
                Console.WriteLine("{0}", a / b);
Логично? Ну так это уже попахивает валидацией. Так вот я от людей добиваюсь такого же подхода, знаешь делай обработку, не знаешь не делай. А использование try-catch оставь на то время, когда не сможешь без него никак. Например проверка доступности сервера:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static IWCFCallback callback;
 
        public static bool IsConnect()
        {
            try
            {
                callback.Ping();
                return true;
            }
            catch
            {
                return false;
            }
        }
Цитата Сообщение от pycture Посмотреть сообщение
Процедура загрузки/расчета каждого отдельного элемента может упасть по любой причине с исключением. Вопрос: как без try catch добиться получения коллекции?
Вот здесь как раз и есть то место, где можно использовать try-catch, но оно никак связано с интерфейсом пользователя.

Приведу еще один пример из жизни. У разработчика периодически падало подключение к SQL Server (сетка плохая и т.п.), так вот он взял и обернул в try-catch (не суть как), но со временем SQL стал падать с таймаутом (при чем у заказчика). Пока не вычистили все try-catсh, так и не могли найти ошибки.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.01.2014, 14:43
MisterMe, Если вы не удаляете из коллекции и вам не важен порядок добавления, то никакой потокобезопасности ятд и не нужно, кроме взаимодействия с формой.
0
7 / 7 / 4
Регистрация: 25.03.2013
Сообщений: 117
09.01.2014, 15:49  [ТС]
Psilon, могу удалять. и была трабла что foreach слетал(т.к. во время прохождения по коллекции она была изменена)
Сейчас сделал немного через п**у, но пока работает:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 Dictionary<string, string> _IdStatusDict = new Dictionary<string, string>();
 List<string> IDs = new List<string>(); //tmp copy
 
                    foreach (var item in Items) 
                    {
                        IDs.Add(item.ID); 
                    }
 
                    //doesn't work
                    //Parallel.ForEach<string>(_IdStatusDict.Keys,
                    //    async (key) =>
                    //{
                    //   _IdStatusDict[key]= await SimpleIoc.Default.GetInstance<Model.OnlineDataService.IOnlineDataService>().GetStatus(key);
                    //}
                    //    );
 
                    foreach (var id in IDs)
                    {
                         
                        _IdStatusDict.Add(id,await SimpleIoc.Default.GetInstance<Model.OnlineDataService.IOnlineDataService>().GetStatus(id)); //uppdating status
                    }
  
                        var ExistingItems =
                        from dictItem in _IdStatusDict
                        from dataItem in Items
                        where dictItem.Key == dataItem.ID
                        select dataItem;
 
                    foreach (var item in ExistingItems)
                    {
                        item.Status = _IdStatusDict[item.ID];
                    }
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.01.2014, 16:48
MisterMe, http://msdn.microsoft.com/ru-r... 10%29.aspx
1
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
09.01.2014, 16:52
Psilon, можно вопрос.

Вот вы дали ссылку (и многие другие дают), а есть ли опыт использования типов из этой коллекции. Я вот не представляю в какой задаче можно использовать хотя бы одну коллекцию. Обычно при синхронизации делаю либо сразу действие (в случае Stack и Queue) или просто слепок коллекции для дальнейшей работы.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.01.2014, 16:55
Grishaco, ну ConcurrentStack и ConcurrentQueue я надеюсь вы понимаете когда использовать. Если нужен многопоточный аналог массива\List - то это Bag.

А вообще lock free очень интересная тема.

Добавлено через 46 секунд
http://habrahabr.ru/company/ifree/blog/195770/
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
09.01.2014, 21:18
Grishaco, т.е try-catch все таки используете в проектах. Ну и славно, а то после фразы
не используя блока try-catch-finally и людям запрещаю
сложилось впечатление что вы ими вообще не пользуетесь.
Цитата Сообщение от Grishaco Посмотреть сообщение
Вот здесь как раз и есть то место, где можно использовать try-catch, но оно никак связано с интерфейсом пользователя
Я не предлагал использовать использовать try-catch, я предлагал использовать try-finally (без всяких catch). И этому блоку самое место в интерфейсе пользователя. Все исключения приедут в глобальный обработчик, а интерфейс всегда будет во вменяемом состоянии (классический вариант возврат курсора из часов в указатель).
0
10 / 25 / 9
Регистрация: 08.12.2013
Сообщений: 115
09.01.2014, 21:23
Цитата Сообщение от MisterMe Посмотреть сообщение
прибиндина
вьюшке
юзверь
юзверей
заблочить
когда ж вы все таки научитесь по людски разговаривать.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
09.01.2014, 21:26
Цитата Сообщение от pycture Посмотреть сообщение
Grishaco, т.е try-catch все таки используете в проектах. Ну и славно, а то после фразы
Цитата Сообщение от pycture Посмотреть сообщение
не используя блока try-catch-finally и людям запрещаю
Может слишком категорично выразился. На самом деле все гораздо проще. Главное условие разработки ни каких try-catch в UI коде. В основном он используется в местах как я описывал выше.

Цитата Сообщение от pycture Посмотреть сообщение
я предлагал использовать try-finally (без всяких catch)
В моем случае все делается через биндинги и соответственно валидация тоже, но дизайблить контролы это уже слишком (не считая интерфейса согласия с лицензией).

Не по теме:


Цитата Сообщение от Hsert Посмотреть сообщение
когда ж вы все таки научитесь по людски разговаривать.
Ведь даже редактор сообщений подсвечивает ошибки, культура что тут поделать.

0
10 / 25 / 9
Регистрация: 08.12.2013
Сообщений: 115
09.01.2014, 21:29
Цитата Сообщение от MisterMe Посмотреть сообщение
То как потокобезопасно изменять коллекцию?
lock
System.Threading.Monitor
System.Threading.ReaderWriterLockSlim
System.Collections.Concurrent.Concurrent Queue
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.01.2014, 05:36
Цитата Сообщение от Hsert Посмотреть сообщение
когда ж вы все таки научитесь по людски разговаривать.
2
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
10.01.2014, 07:26
Цитата Сообщение от Grishaco Посмотреть сообщение
В моем случае все делается через биндинги и соответственно валидация тоже, но дизайблить контролы это уже слишком (не считая интерфейса согласия с лицензией).
Я не уловил 2 вещи.
1) Вы считаете что отключать элементы интерфейса это моветон и таже студия которая на момент долгих операций (при коипиляции например) блокирует половину меню поступает в корне неверно?
2) Как биндинги помогут вернуть курсор в указатель из часов при выбросе искличения в функции?
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
10.01.2014, 10:13
Цитата Сообщение от Grishaco Посмотреть сообщение
но дизайблить контролы это уже слишком (не считая интерфейса согласия с лицензией)
Почему же, например, кнопка удаления из коллекции выбранного элемента, если она вынесена отдельно.
Если ни один не выбран, то кнопка неактивна.
А также в программах с большим функционалом иногда в панели очень много кнопок, и в зависимости от контекста они могут быть неактивны.

Добавлено через 1 минуту
Цитата Сообщение от pycture Посмотреть сообщение
2) Как биндинги помогут вернуть курсор в указатель из часов при выбросе искличения в функции?
это можно сделать с помощью конвертера, другой вопрос зачем?

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
public bool IsWait
{
 get; set;
}
 
private LongRunningMethod()
{
 IsWait=true;
}
XML
1
2
3
< BooleanToCursorConverter x:Key= BooleanToCursorConverter/>
 
<Grid Cursor={Binding IsWait, Converter={StaticResource BooleanToCursorConverter}}
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
10.01.2014, 10:51
Цитата Сообщение от kenny69 Посмотреть сообщение
это можно сделать с помощью конвертера
вопрос об этом
C#
1
2
3
4
5
6
private LongRunningMethod()
{
 IsWait=true;
 /// много действий и внезапно
 throw new Exception("Некорретное значение х");
}
кто курсор назад вернет? напоминаю try-finally использовать нельзя.
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
10.01.2014, 11:10
вы сделали ли:
throw new Exception("Некорретное значение х");

как без try-finally?

и зачем без try-finally? конечно лучше исключить их использование, когда можно провести валидацию, а не отдавать все на случай появления исключения, но в случаях, например, работы с удаленными сервисами, когда может он может не ответить тут никак.
да и вообще логику работы с ними в отдельный модуль, который уже обработает и вернет осмысленный ответ.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
10.01.2014, 11:17
Цитата Сообщение от pycture Посмотреть сообщение
1) Вы считаете что отключать элементы интерфейса это моветон и таже студия которая на момент долгих операций (при коипиляции например) блокирует половину меню поступает в корне неверно?
Цитата Сообщение от kenny69 Посмотреть сообщение
А также в программах с большим функционалом иногда в панели очень много кнопок, и в зависимости от контекста они могут быть неактивны
Я говорю про то что пользователь работает с программой, а тут внезапно половина кнопок заблокировалась, а не о том, что блокирование это реакция на действие пользователя. Посмотрите вопрос в теме ТС говорит, что пришли данные он блокировал кнопки, т.е. пользователь ничего не делает, а кнопки блокируются и разблокируются сами по себе. Другое дело если ТС добавит кнопку обновить и в ней заблокирует и разблокирует кнопки.

Цитата Сообщение от pycture Посмотреть сообщение
Как биндинги помогут вернуть курсор в указатель из часов при выбросе искличения в функции?
Давайте конкретный пример. Что значит функция выбросит исключение?

Цитата Сообщение от kenny69 Посмотреть сообщение
конечно лушче исключить такие ситуации когда их использовать нельзя
Так вот я про тоже, зачем в коде, который управляет 100500 контролов ставить try-catch, это всего навсего контролы, и исключения здесь, явная недоработка разработчика.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
10.01.2014, 11:50
Grishaco,
C#
1
2
3
4
5
6
private LongRunningMethod()
{
 IsWait=true;
 /// много действий и внезапно
 throw new Exception("Некорретное значение х");
}
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
10.01.2014, 11:58
Цитата Сообщение от pycture Посмотреть сообщение
внезапно
*throw new Exception("Некорретное значение х");
Здесь два варианта:
1. Если исключение кинул программист, будет делать корректную валидацию и убирать throw.
2. Если исключение возникло в процессе тестирования (не валидные данные), опять же будет исправлять программист, в данном случае у него будет вся информация об исключении.

У меня такое ощущение, что мы либо не понимаем друг друга, либо говорим об одном и том же, только по разному.

Давайте так, мы работает в одной команде, я написал класс

C#
1
2
3
4
5
6
7
8
public class Hello
        {
            public Hello(string mess)
            {
                if (mess == null)
                    throw new ArgumentNullException("mess");
            }
        }
Теперь вам необходимо использовать его в 100500 местах в вашем коде, не ужели вы будете везде писать try-catch или try-finaly?
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
10.01.2014, 11:58
Цитата Сообщение от kenny69 Посмотреть сообщение
как без try-finally
Я и пытаюсь выяснить как. Grishaco, настаивает на том что они не нужны.
Мне интересен способ реанимации интерфейса без них.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
10.01.2014, 12:03
Цитата Сообщение от pycture Посмотреть сообщение
Мне интересен способ реанимации интерфейса без них.
Да нет никакого способа, все что можно, а это 99%, программист разруливает валидацией, а что нельзя будет выявлено при тестировании. И тот код с UI который я привел не сможет уронить ни что (ну кроме 3 исключений).

Или вы не представляете себе код без try-catch?

Добавлено через 2 минуты
P.S. Я привел пример, возможно не удачный. Давайте теперь вы приведете пример где никак не обойтись без try-finaly. Я во всяком случае такого не встречал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2014, 12:03

Отобразить коллекцию
Возник следующий вопрос: Некоторым образом формируется коллекция документов. Хотелось бы всю эту коллекцию выводить во вью в...

Реализовать коллекцию
Задание. Создать класс Student с двумя полями и конструктором с параметрами. Если нужно добавить в класс дополнительные методы или...

Отсортировать коллекцию
Нужно отсортировать объем двигателя (FUELCONSUMPTION ) по возрастающей public class Bentley extends AbstractCar { private...

Заполнить коллекцию
Создать коллекцию для пар Student, int. Создать метод который будет добавлять в коллекцию пару Student, int. Целое число должно быть...

Объект в коллекцию
Хочу, чтобы объекты которые я создаю (Person person1 = new Person), каждый при создании, автоматически ложился в List и я мог вывести на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
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
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru