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?
SynchronizingObject for an event
Asked Answered
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);
}
};
}
Is this class appropriate to use when I want to synchronize with a self-defined class (not winforms) as shown here: https://mcmap.net/q/912450/-will-the-threadpool-queue-a-timer-39-s-callback-function-sometimes-scheduling-more-than-one-thread-at-the-same-time/328397 –
Okie
@makerofthings7: I don't think it's the approach I'd use in that case, no. If you're using .NET 4, look at what the TPL provides. –
Earthaearthborn
© 2022 - 2024 — McMap. All rights reserved.