События и многопоточный код в .NET - PullRequest
0 голосов
/ 22 декабря 2009

Проект C #.

Итак, у меня есть куча многопоточного кода, который предназначен для работы в качестве библиотеки. Это отдельный проект от пользовательского интерфейса.

В моей библиотеке есть центральный объект, который необходимо создать, прежде чем будет создано что-либо, что вызовет события.

Возможно ли, чтобы этот главный объект был передан в некоторых объектах, чтобы мои события могли выяснить, когда их нужно будет вызвать для возврата в основной поток пользовательского интерфейса?

Мне бы очень хотелось, чтобы пользовательский интерфейс не вызывал кучу вызовов, поскольку его обработчики событий почти всегда будут вызываться из некоторого случайного фонового потока.

Ответы [ 3 ]

9 голосов
/ 22 декабря 2009

Исходя из того, что вы описываете, лучше всего сделать так, чтобы все ваши объекты принимали SynchronizationContext в качестве аргумента в своем конструкторе.

Если вы сделаете это, когда вам нужно вызвать событие, вы можете использовать SyncrhonizationContext.Post , чтобы «вызвать» событие в потоке пользовательского интерфейса.

Таким образом, ваша библиотека будет независима от пользовательского интерфейса (может работать в Windows Forms или WPF), и вы можете вызывать события в потоке пользовательского интерфейса по мере необходимости.

Пользователь вашей библиотеки просто создаст ваш объект, используя SynchronizationContext.Current (который дает вам действительный контекст в приложениях Windows Forms и WPF, без добавления ссылки ни на один из них).

0 голосов
/ 22 декабря 2009

Вы смотрели на Фасад , Прокси , Завод и Синглтон узоры?

Если вы реализуете свой базовый объект как Singleton, и предоставляете прокси и фабричные методы для производства и доставки их вызывающим сторонам вашей библиотеки, это становится довольно простым. Шаблон Facade может упростить эту задачу, абстрагируя большинство внутренних элементов того, что происходит в бэкэнде.

Объединение Factory и Singleton и обеспечение того, чтобы все классы, которые вы хотите предоставить, имели конструкторы, требующие вашего основного объекта, - хороший способ реализовать этот дизайн. Я не знаю основных требований / дизайна вашей библиотеки, поэтому я не уверен, сработает ли это для вас или нет.

0 голосов
/ 22 декабря 2009

Используя таймер или отвечая на событие, поток пользовательского интерфейса (или объект с привязкой к данным в потоке) может опрашивать объект «статус» и ограничивать объем работы, который должен выполнять пользовательский интерфейс.

...