|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
Есть разделяемый ресурс, для работы с которым хочу создать отдельный класс. Чтобы не было конфликтов в многопоточном приложении, буду применять lock. Вопрос как лучше сделать? Оборачивать тело каждого метода в lock: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Или есть более изящные решения, автоматически лочащие все методы класса? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 12:50 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
iskatelsql Или есть более изящные решения, автоматически лочащие все методы класса? Декоратор + прокси. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 14:26 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
так не стоит делать, но кого это останавливало... Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 14:53 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
следующая тема автора: как найти дедлок :D ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 14:59 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
Код: c# 1. 2.
А так точно сработает? Мало нашел по сабжу, но пишут что класс к тому же должен быть унаследован от ContextBoundObject. Вроде как: Код: c# 1. 2.
или не обязательно? Если я правильно понял - первый вариант блочит все методы, если поток пользуется хотябы одним из них, а второй вариант - методы по отдельности? т.е. когда один поток юзает метод1, второй поток может спокойно юзать метод2? ЗЫ. где тут можно словить дедлок, если потоки не зависят друг от друга, обрабатывают свою порцию данных каждый... И ерунда может произойти наверное только если ресурс физически исчезнет... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 15:54 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
Что-то оно не работает - вот на таком примере лезут и единицы и двойки, хотя по идее должны по очереди Код: 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.
Так вроде работает. Но мало чем отличается от того чтоб каждый метод в lock оборачивать. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2020, 19:08 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
iskatelsql, ну гляньте сюда ещё: https://github.com/Fody/MethodDecorator если скажете какую задачу решаете, зачем, может болше сможем помочь ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 01:45 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
hVostt если скажете какую задачу решаете, зачем, может болше сможем помочь Да задача то примитивная - писать в базу sqlite. Мне показалось проще понаставить локов, чем отлавливать исключения "база занята" и делать повторные попытки... Ну и так, для общего развития - мож еще зачем пригодится когда-нибудь.. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 13:26 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
iskatelsql, можно пример, в какой ситуации для записи в базу потребовались локи? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 14:08 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
vb_sub iskatelsql, можно пример, в какой ситуации для записи в базу потребовались локи? Можно погуглить по "SQLite database is locked". sqlite однопоточная по крайней мере реализация System.Data.SQLite , если транзакция продлится больше таймаута (в своей глянул busy_timeout 3000 , наверное дефолтный), остальные все запросы на подключение вылетят с ошибкой. и тут либо таймаут выкручивать (моя паранойя подсказывает что где - то на тысячелетие :)) либо локи, либо чтото вроде Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Что тоже не эстетично. Концепция таймаута в локальной то базе мне честно говоря не нравится. А локи - локи вроде ничего так подходят, ну стоит поток (Тем более что это не совсем поток, а Task и на локах должен по идее освободить поток для других задач.), ждет своей очереди, рано или поздно запишет... Ведь то что должно быть записано - должно быть записано а не про...теряно. Так то по разному можно сделать... я вот локи выбрал. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 14:35 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
iskatelsql vb_sub iskatelsql, можно пример, в какой ситуации для записи в базу потребовались локи? Можно погуглить по "SQLite database is locked". sqlite однопоточная по крайней мере реализация System.Data.SQLite , если транзакция продлится больше таймаута (в своей глянул busy_timeout 3000 , наверное дефолтный), остальные все запросы на подключение вылетят с ошибкой. и тут либо таймаут выкручивать (моя паранойя подсказывает что где - то на тысячелетие :)) либо локи, либо чтото вроде ... Таймаут бесполезно увеличивать. В SQLite можно дэдлок словить даже в один поток 21957488 В SQLite подход к блокировкам не как у взрослых СУБД, он другой. Тут книга по SQLite на русском , там один раздел про работу блокировок, советую почитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 14:55 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
iskatelsql, Почему бы тебе организовать очередь например BlockingCollection, из комманд к SQLLite базе? Очередь будет очищаться посредством удаления выполненных комманд и все будет в одном потоке? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 15:26 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
vb_sub, слишком мудрено получится, где-то надо например вставить массив, где-то распихать нескольким по таблицам, связанным ключом. Т.е. разные ф-ции получатся, а некоторые еще и что-то возвращают. Этож какую структуру мне придется изобретать чтоб пропихнуть через коллекцию, а потом ее еще и расшифровывать. А в обратку вернуть данные еще одна коллекция? Тогда как сделать так чтоб данные из нее схватил "нужный" поток? Либо я что-то не понимаю, либо хрень какая-то выходит. Да и зачем плодить сущности, разве недостаточно класса, содержащего ф-ции, доступ к которым в единый момент времени имеет только один поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2020, 15:44 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
iskatelsql Да задача то примитивная - писать в базу sqlite. Мне показалось проще понаставить локов, чем отлавливать исключения "база занята" и делать повторные попытки... Понаставить локов -- самое кривое решение, из всех, что вы могли выбрать. SQLite не предназначена для использования в многопользовательской среде изначально, т.е. вы пытаетесь применить инструмент в задачах, для которых нужно применять другой инструмент. Если прям очень хочется, организуйте очередь. Но лучше возьмите более подходящую БД для своих задач, зачем извращаться? iskatelsql Ну и так, для общего развития - мож еще зачем пригодится когда-нибудь.. Покрытие локами вам не пригодиться. По крайне мере в любом более менее серьёзном проекте подобные решения не одобрят, так как адские костыли. При желании конечно можно и лоб расшибить. Но зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 07:21 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
hVostt Понаставить локов -- самое кривое решение, из всех, что вы могли выбрать. SQLite не предназначена для использования в многопользовательской среде изначально, т.е. вы пытаетесь применить инструмент в задачах, для которых нужно применять другой инструмент. Я подозреваю у него не многопользовательская среда, а работа с БД из разных потоков. Тут и локов не надо, т.к. это все разруливается внутри SQLite. По сути тоже самое будет, т.к. система блокировок в SQLite примитивна, там одна большая блокировка на всю БД, т.е. по сути тоже самое что ТС изобретает. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2020, 07:53 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
Dima T hVostt Понаставить локов -- самое кривое решение, из всех, что вы могли выбрать. SQLite не предназначена для использования в многопользовательской среде изначально, т.е. вы пытаетесь применить инструмент в задачах, для которых нужно применять другой инструмент. Я подозреваю у него не многопользовательская среда, а работа с БД из разных потоков. Тут и локов не надо, т.к. это все разруливается внутри SQLite. По сути тоже самое будет, т.к. система блокировок в SQLite примитивна, там одна большая блокировка на всю БД, т.е. по сути тоже самое что ТС изобретает. Ну это проблема так называемого execution path, алгоритмов. Большинство проблем связаны с невозможностью описать процесс на словах. Обычным русским языком, нет постановки задачи, нет проработки, нет чётко сформулированных ожиданий. Т.е. оно вот так. Вот что-то в базу пишу, тут вот присваиваю, чёт читаю.. Оппа -- ошибка. Ошибка вроде как говорит, чувак, ты вообще всё непраивльно делаешь? Чего ты творишь вообще? Но программер неумолим.. Заткнись глупый компьютер, щас я всё локами покрою, посомтрю как ты запоёшь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2020, 23:28 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
hVostt Ну это проблема так называемого execution path, алгоритмов. тесты показывают что и без локов есть 30 сек на запись, наверное обойдусь без них. Вот только почему все так против этих локов? их добавили чтоб на форумах смеяться? Механизм как механизм. (правильно я понимаю, что таск на локе отдает поток другим страждушим?) ЗЫ. если я про семафоры скажу, меня тут забанят? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2020, 23:50 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
iskatelsql ...А локи - локи вроде ничего так подходят, ну стоит поток (Тем более что это не совсем поток, а Task и на локах должен по идее освободить поток для других задач.) Task + lock - интересный микс выж про async/await код? можете свой первый пример допилить и показать где там Task и где lock? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2020, 09:36 |
|
Как "залочить" весь класс?
|
|||
---|---|---|---|
#18+
iskatelsql Вот только почему все так против этих локов? их добавили чтоб на форумах смеяться? Механизм как механизм. (правильно я понимаю, что таск на локе отдает поток другим страждушим?) Против использования микроскопа в качестве молотка, но не против самого микроскопа. iskatelsql ЗЫ. если я про семафоры скажу, меня тут забанят? Смотря что скажете :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2020, 01:51 |
|
|
start [/forum/topic.php?fid=20&msg=39996975&tid=1398471]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
160ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 276ms |
0 / 0 |