SynchronizingObject
это просто свойство ISynchronizeInvoke
. (Этот интерфейс, например, реализован элементами управления WinForms.)
Вы можете использовать тот же интерфейс самостоятельно, хотя с событием vanilla нигде не указывается объект синхронизации.
То, что вы могли бы сделать, это написать служебный метод, который принимает делегат и ISynchronizeInvoke
и возвращает делегат, который обеспечивает запуск исходного делегата в нужном потоке.
Например:
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);
}
};
}