should I lock event in the following case:
event foo;
thread A: will call foo += handler;
thread B: will call foo -= handler;
should I lock foo?
Event locking allows a multithreaded event broker to categorize incoming alerts based on the values of specified alert fields and then to process them within a category one at a time in the order that they were sent to the ObjectServer.
Time Lock Select this option to keep the Event from being moved to a different time position within the Track.
The events are locked. This is indicated by a padlock symbol. To unlock an event, select the event and select Edit > Unlock.
Locking on foo
is a bad idea, because the value will change each time. You should lock on a variable which doesn't change:
private readonly object eventLock = new object();
private EventHandler fooHandler;
public event EventHandler Foo
{
add
{
lock (eventLock)
{
fooHandler += value;
}
}
remove
{
lock (eventLock)
{
fooHandler -= value;
}
}
}
private void OnFoo(EventArgs e)
{
EventHandler handler;
lock (eventLock)
{
handler = fooHandler;
}
if (handler != null)
{
handler(this, e);
}
}
Note that if you use a field-like event, like this:
public event EventHandler Foo;
then you'll automatically get a "lock(this)" on add/remove, although you'd have to manually add it when fetching the handler before calling it (assuming you want to make sure you read the most recently written value). Personally I'm not a fan of locking on "this", but you may not mind - and it certainly makes for simpler code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With