Есть ли возможность cоздавать именные локеры на лету?

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 720
Благодарностей
1 377
Баллы
113
Приветствую.

представьте кубик c# примерно такого содержания:

Код:
string task_id = project.Variables["task_id"].Value;

// тут код использующий task_id
Мне нужно лочить код только в том случае, если в разных потоках зеннопостера одинаковый task_id ... во всех остальных случаях лочить не нужно. Как правильно организовать такой локер?

На такую конструкцию ZP вроде бы не ругается, но вот работает ли она? ;-)

lock("locker"+task_id){
...
}

Проводить эксперименты работоспособности этой конструкции сейчас особого желаня нет ;-)
Может кто-то просто знает будет такое корректно работать или нужно как-то по другому это реализовывать?
 
Последнее редактирование:

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 720
Благодарностей
1 377
Баллы
113
Ладно, раз никто не ответил, то пришлось самому пробовать ;-)))

Всем интересующимся докладываю: в таком виде как указано в первом посте НЕ работает т.к при одинаковом task_id в разных потоках, значение строки (имя локера) будет одинаковое, но ссылка на объект в памяти будет у них разная. В общем одинаковое значение (например - locker12345), но объекты это разные, поэтому и лочить по ним не получится.

Но решение есть. Можно применить так называемое интернирование (кому интересно что это, можете сами погуглить по фразе "интернирование строк в c#"), тогда строки с одинаковым значением из разных потоков будут ссылаться на один и тот же объект, а следовательно могут быть использованы для лока

Рабочее решение:

Код:
string task_id = project.Variables["task_id"].Value;

lock(string.Intern("locker"+task_id)){
...
}
 
Последнее редактирование:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)