With Timer
objects, I can set the SynchronizingObject
property to avoid having to use invoke when updating the GUI from the timer\'s event handler.
SynchronizingObject
is just an ISynchronizeInvoke property. (That interface is implemented by WinForms controls, for example.)
You can use the same interface yourself, although with a vanilla event there's nowhere to really specify the synchronization object.
What you could do is write a utility method which takes a delegate and an ISynchronizeInvoke
, and returns a delegate which makes sure the original delegate is run on the right thread.
For example:
public static EventHandler Wrap(EventHandler original,
ISynchronizeInvoke synchronizingObject) where T : EventArgs
{
return (object sender, T args) =>
{
if (synchronizingObject.InvokeRequired)
{
synchronizingObject.Invoke(original, new object[] { sender, args });
}
else
{
original(sender, args);
}
};
}