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. If I have a class that instead subscribes to an event and has to update the GUI in the event handler, is there an analogous concept? Or do I have to write the InvokeRequired boilerplate code?
views:
357answers:
2
+2
A:
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<T> Wrap<T>(EventHandler<T> 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);
}
};
}
Jon Skeet
2009-12-03 17:07:28