#c_sharp #распараллеливание
У меня в коде много блокировок. Хотел немного сократить код и написал небольшой велосипед. Скажите пожалуйста будет ли это работать должным образом? public static class LockingCall { public static readonly object LockObject = new object(); public static void Invoke(Action action) { lock (LockObject) { action(); } } public static T Invoke(Func function) { lock (LockObject) { return function(); } } }
Ответы
Ответ 1
lock блокирует только тех, у кого общий объект блокировки. Поэтому нужно избегать использования статических или слишком общих объектов для этого. Блокировка должна быть минимальной и значит объект блокировки должен затрагивать минимально необходимое количество держателей блокировки (если нужно то использовать именованные блокировки) и блокировать как можно меньшую секцию кода. Также неправильно блокировать lock(this), потому что кто-то внешний может вызвать lock(обьект в котором lock(this) ) и получится неожиданная блокировка. Ну и конечно по возможности использовать другие методы в виде потокобезопасных коллекций и async/await
Комментариев нет:
Отправить комментарий