- Регистрация
- 23.12.2014
- Сообщения
- 14 427
- Благодарностей
- 5 453
- Баллы
- 113
Все что внутри лока будет задерживать доступ, любая манипуляция, в том числе и пауза.Вот я залочил чтение, запись и паузу 5 сек. Значит ли это, что 5 сек будет список не доступен?
У меня не работает. Это 100% инфа что должно работать?Все что внутри лока будет задерживать доступ, любая манипуляция, в том числе и пауза.
Напиши свой код, так будет проще разобраться.Весь цикл в локе, весь код в локе.
Да мне уже говорили, что локи лочат не все. Наверняка и темы есть на форуме. Код сделать можно, но не сегодня)Напиши свой код, так будет проще разобраться.
ТакойДа мне уже говорили, что локи лочат не все.
lock(SyncObject) { ... }
лочит всё. Впринципе, как и любой другой: SyncObjects.ListSyncer, SyncObjects.TableSyncer, SyncObjects.InputSyncer. Разница только в разграничении доступа к разным ресурсам.А у меня стоитТакойlock(SyncObject) { ... }
лочит всё.
lock (SyncObjects.ListSyncer)
Это стандартный лок, он распространяется на все работающие шаблоны в ZP.Походу в этом проблема! Буду тестить смотреть!
namespace ZennoLab.OwnCode
{
class Locker {
public static object lstTxtProxy = new object(); // чтение прокси
public static object sqliteGetData = new object(); // чтение базы
public static object sqliteSetData = new object(); // запись базы
}
}
lock (Locker.lstTxtProxy) {...}
Это не имеет значения, рекомендую почитать подробнее о локах здесь:А у меня стоитlock (SyncObjects.ListSyncer)
Походу в этом проблема! Буду тестить смотреть!
lock(Object ){ } - встроенное средство c#. К zenno прямого отношения не имеет и с багами ни как не может быть связанно. Так что скорее всего дело в логике. Но без кода - это как гадать на кофейной гущеДа мне уже говорили, что локи лочат не все. Наверняка и темы есть на форуме. Код сделать можно, но не сегодня)
Логика вложенного шаба такова, что там всегда будет идти по ветке 0 потокаЯ попробую выразится иначе, а то может меня некоторые недопоняли. Мне надо отановить активность всех потоков кроме первого. Первый поток начинает работаь в локе со списком, ставит паузу, допустим она 20 сек, эта пауза в локе! Соотвественно другие потоки должны ждать, но этого не происходит. Почему?
Снипет с паузой 20 сек в локе, для первого (нулевого) потока. Он выполняется 100% первый, но он никак не препятствует другим потокам обращатся к списку (а должен).
Посмотреть вложение 49549
Снипет для остальных потоков, тоже с локом, но уже без паузы. Теоретически они должны ждать пока первый (нулевой) сделает свои дела, но этого не происходит (а должно).
Посмотреть вложение 49550
Шаблон приложил, снипеты там есть.
Ты ошибаешься. Если обнулена переменная то там все четко в многопотоке в плане разделения. Ведь мы говорим про многопоток. Иначе какой смысл от этого снипета в одном потоке.Логика вложенного шаба такова, что там всегда будет идти по ветке 0 потока
lock(SyncObjects.ListSyncer)
Так тоже не работает. Хотя по видео работает. Мистика. Проверить смогу только вечером. Спасибо за подсказку.Нужно
Либо свои объекты как выше писалиC#:lock(SyncObjects.ListSyncer)
https://cloud.mail.ru/home/2020-02-04_07-06-56.mp4?weblink=59Ac/2m9BUsAVd
Х.з. У меня работает. На видео же видноТак тоже не работает.
Ты ошибаешься. Если обнулена переменная то там все четко в многопотоке в плане разделения. Ведь мы говорим про многопоток. Иначе какой смысл от этого снипета в одном потоке.
lock(SyncObject) {
try {
var gbVar = project.GlobalVariables["[email protected]", "globVar1"];
if (gbVar.Value == "0"){
throw new KeyNotFoundException("Нулевое значение");
}
// go to bad exit if already initilized
return null;
} catch (KeyNotFoundException ex) {
int defaultValue = 0;
project.GlobalVariables.SetVariable("[email protected]", "globVar1", defaultValue);
project.Variables["currentValue"].Value = defaultValue.ToString();
// go to good exit if we initilized
return "ok";
}
}
Мне можешь не объяснять. Я не особо шарю в шарпе. Этот снипет делает то что нужно. Запусти в многопотоке и сам увидишь.этот код всегда идёт зеленой. Переменная не существует - зеленая. переменная 0 - зеленая. А другие условия из этих не появятсяC#:lock(SyncObject) { try { var gbVar = project.GlobalVariables["[email protected]", "globVar1"]; if (gbVar.Value == "0"){ throw new KeyNotFoundException("Нулевое значение"); } // go to bad exit if already initilized return null; } catch (KeyNotFoundException ex) { int defaultValue = 0; project.GlobalVariables.SetVariable("[email protected]", "globVar1", defaultValue); project.Variables["currentValue"].Value = defaultValue.ToString(); // go to good exit if we initilized return "ok"; } }
В общем, если вкратце, всю логику этих локов нужно объединять в один код. Потому что между их вызовами есть промежутки в которые могут просачиваться потоки. Либо думать над костыльным локом на кубиках, которым будешь ограничивать область шаблона. На форуме кто-то такое уже придумывал, правда нужно дорабатывать былоМне можешь не объяснять. Я не особо шарю в шарпе. Этот снипет делает то что нужно. Запусти в многопотоке и сам увидишь.
А ну может глобалку создать забыл. Она же глобалка и работает если даже создана в другом шабе. Если ты про это.
Я ставлю просто паузу и все отлично пашет. Проблем не замечал. Но обнулять переменную это запара конечно.В общем, если вкратце, всю логику этих локов нужно объединять в один код. Потому что между их вызовами есть промежутки в которые могут просачиваться потоки. Либо думать над костыльным локом на кубиках, которым будешь ограничивать область шаблона. На форуме кто-то такое уже придумывал, правда нужно дорабатывать было
ну очевидно, что сейчас у тебя что-то работает не так, как хотелосьЯ ставлю просто паузу и все отлично пашет. Проблем не замечал. Но обнулять переменную это запара конечно.
Речь в теме вобще не про этот снипет. Речь о локе который идет после него.ну очевидно, что сейчас у тебя что-то работает не так, как хотелось
конкретно этот лок вообще тёмная лошадка. Когда-то я считал, что он пашет на все проекты. Потом узнал, что его область действия ограничивается одним проектом. Теперь мне кажется, что он общий только для завёрнутого в него участка кодаРечь в теме вобще не про этот снипет. Речь о локе который идет после него.
Но вроде Олег решил пооблему сменой типа лока. Я вечером только проверю.на основном сниппете.
конкретно этот лок вообще тёмная лошадка. Когда-то я считал, что он пашет на все проекты. Потом узнал, что его область действия ограничивается одним проектом. Теперь мне кажется, что он общий только для завёрнутого в него участка кода
я о SyncObject из коробки2020-02-04_09-30-37.mp4 / Облако Mail.ru
Облако Mail.ru - это ваше персональное надёжное хранилище в интернете.cloud.mail.ru
Или ты имел ввиду SyncObject, который в общем коде?
Да я проверил на основном сниппете. все четко работает. Спасибо.Нужно
Либо свои объекты как выше писалиC#:lock(SyncObjects.ListSyncer)
https://cloud.mail.ru/home/2020-02-04_07-06-56.mp4?weblink=59Ac/2m9BUsAVd