Я знаю, что вы можете заблокировать объект в C# с помощью блокировки, но можете ли вы отказаться от блокировки и подождать, пока что-то еще уведомит вас о том, что оно изменилось, как вы можете в java, с помощью wait and notify?
Мне кажется, что synchronized и lock в java и C# соответственно синонимы.





Думаю, вам подойдет Wait Handles. Посмотрим, поможет ли это.
Эквивалентная функциональность (включая обычную блокировку) находится в классе Монитор.
foo.notify() => Monitor.Pulse(foo)
foo.notifyAll() => Monitor.PulseAll(foo)
foo.wait() => Monitor.Wait(foo)
Оператор lock в C# эквивалентен вызову Monitor.Enter и Monitor.Exit с соответствующим блоком try / finally.
См. мой учебник по потокам или Джо Альбахари для более подробной информации.
@ebyrob: Где это говорит?
о, извините, меня смутила статья MSDN: msdn.microsoft.com/en-us/library/… говорит: «// Подождите, если очередь занята. перед вызовом: Monitor.Wait (m_smplQueue);» Я читал оба одновременно и не понимал, что есть что.
Я обернул их в методы расширения, чтобы упростить перенос моего кода с Java.
@SteveTaylor: С другой стороны, это сделало бы его менее идиоматичным для тех, кто знаком с .NET и читает ваш код ... Полагаю, это зависит от вашей команды.
Команда состоит из меня, единственного основателя, создавшего свой стартап. Веб-приложение написано на Java. Код C# - это клиент API, работающий как служба Windows, что, как я думал, лучше всего сделать на C#. Если / когда я возьму разработчиков, ну, они могут изменить это в более идиоматической форме, если захотят.
Из Java API: wait () - заставляет текущий поток ждать, пока другой поток не вызовет метод notify () или метод notifyAll () для этого объекта. В вашем руководстве, похоже, говорится, что Monitor.Wait () ждет только в том случае, если другой поток борется за блокировку.