I’ve recently created these two (unrelated) methods to replace lots of boiler-plate code in my winforms application. As far as I can tell, they work ok, but I need some reassurance/advice on whether there are some problems I might be missing.
(from memory)
static class SafeInvoker { //Utility to avoid boiler-plate InvokeRequired code //Usage: SafeInvoker.Invoke(myCtrl, () => myCtrl.Enabled = false); public static void Invoke(Control ctrl, Action cmd) { if (ctrl.InvokeRequired) ctrl.BeginInvoke(new MethodInvoker(cmd)); else cmd(); } //Replaces OnMyEventRaised boiler-plate code //Usage: SafeInvoker.RaiseEvent(this, MyEventRaised) public static void RaiseEvent(object sender, EventHandler evnt) { var handler = evnt; if (handler != null) handler(sender, EventArgs.Empty); } }
EDIT: See related question here
UPDATE
Following on from deadlock problems (related in this question), I have switched from Invoke to BeginInvoke (see an explanation here).
Another Update
Regarding the second snippet, I am increasingly inclined to use the ’empty delegate’ pattern, which fixes this problem ‘at source’ by declaring the event directly with an empty handler, like so:
event EventHandler MyEventRaised = delegate {};
This is good stuff. Make them extension methods though to clean up your code a little more. For example:
Now on your events you can call: myEvent.Raise(this);