Кажется, вы неправильно понимаете, как работает блокировка.
В C # "ключевое слово lock гарантирует, что один поток не входит в критическую секцию кода, пока другой поток находится в критической секции. Если другой поток пытаетсячтобы ввести заблокированный код, он будет ждать, блокировать, пока объект не будет освобожден. "Таким образом, он не защищает заблокированный объект от мутации.А в F # lock
работает точно так же.
Кстати, AFAIK, lock
это просто сахар вокруг Monitor class.
И соответственноДону Сайму определение функции блокировки на самом деле выглядит следующим образом:
open System.Threading
let lock (lockobj:obj) f =
Monitor.Enter lockobj
try
f()
finally
Monitor.Exit lockobj
ОБНОВЛЕНИЕ: Поскольку блокировка не делает объект доступным только для чтения и поскольку у вас нет контроля над кодом WPF,Решение вашей проблемы включает добавление синхронизации потоков к свойствам доступа WPF (и попытка не блокировать поток пользовательского интерфейса) или планирование работы в потоке пользовательского интерфейса или в другом месте.Трудно сказать, не зная точную проблему.Что ж, хорошо, что в Интернете полно информации.
UPDATE2: Упс, я прочитал "WPF" вместо "WCF".Ну, это делает вашу жизнь намного проще.Вам просто нужно добавить синхронизацию потоков в реализацию методов WCF, и в большинстве случаев вы можете перестать беспокоиться о их блокировке.Так что просто аккуратно добавьте блокировки ко всему соответствующему коду ...