SynchronizingObject for an event
With Timer
objects, I can s开发者_运维技巧et 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?
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);
}
};
}
You may take a look at the BackgroundWorker class.
精彩评论