What I miss the most from C# is the lock keyword. Unfortunately Delphi doesn’t (yet) have such a “feature” so we’re stuck making calls to synchronization objects manually. It’s not a big problem actually but can get quite frustrating when you have lots of “protected” code sections.
To overcome this limitation, I came up with a quick and dirty method (thanks to anonymous methods) that would somehow replicate the “lock” behavior:
type TLockedCode = reference to procedure; procedure Lock(const Obj : TObject; const Code : TLockedCode); var CaughtException : Exception; begin CaughtException := nil; { Lock the monitor and run the code } TMonitor.Enter(Obj); try Code(); except { Catch the exception and raise it again after the unlock code. } on Ex : Exception do CaughtException := Ex; end; TMonitor.Exit(Obj); { Raise the exception if there was any } if CaughtException <> nil then raise CaughtException; end;
Now you can write code like this:
begin Lock(SomeObj, procedure begin {...} { ... Do some "locked" code here! } {...} end); end;
Not the prettiest solution (calling anonymous methods is a bit expensive) but it does the trick if you need to write a lot of “locked” code.