SynchronizingObject для события - PullRequest
       20

SynchronizingObject для события

3 голосов
/ 03 декабря 2009

С объектами Timer я могу установить свойство SynchronizingObject, чтобы избежать необходимости использовать invoke при обновлении GUI из обработчика событий таймера. Если у меня есть класс, который вместо этого подписывается на событие и должен обновить GUI в обработчике событий, есть ли аналогичная концепция? Или я должен написать шаблонный код InvokeRequired?

Ответы [ 2 ]

3 голосов
/ 03 декабря 2009

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);
        }
    };
}
0 голосов
/ 03 декабря 2009

Вы можете взглянуть на BackgroundWorker класс.

...