2011-12-14 3 views
2

У меня есть одноэлементный ящик, который я разделяю между кучей разных потоков. Несколько раз один поток должен общаться с другим.Обработчик событий против делегата

Я думал о двух подходах:

Каждый поток помещает делегат в одноэлементных. Когда время необходимо, один поток вызывает функцию в singleton, которая вызывает другого делегата в singleton, который уведомляет каждый поток о том, чтобы что-то сделать.

Другая опция использует стандартный механизм обработки событий.

Есть ли преимущество в использовании одного или другого?

+0

Что такое точка синглтона здесь? – Oded

+1

Ни делегат, ни обработчик событий не могут передавать управление из одного потока в другой. Я уверен, что здесь что-то не хватает: что вы планируете делать внутри делегата/события, чтобы сделать другие потоки? – dasblinkenlight

+0

В значительной степени это всего лишь глобальная переменная для разных классов, которые могут общаться друг с другом. – SamFisher83

ответ

3

Стандартная система событий будет работать лучше для вас, если это то, что вы хотите (и, похоже, это так), почему вы хотите изобрести колесо?

Я бы подумал, что стандартные события будут более знакомы людям, просматривающим код, и я бы предположил, что это будет более результативно. Это проблема? Вы пробовали перфекционировать его?

4

Независимо от того, какой поток зарегистрировал делегат с singleton (или добавил событие в singleton, это не имеет значения) уведомление произойдет в контексте уведомляющего потока.

Если вам нужно сделать один поток, сделайте что-то по указанию другого потока, вам нужно сообщить это намерение с данными. Например, каждый поток может настроить очередь блокировки и ждать, пока элементы будут помещены в их очередь другими. Этими элементами могут быть делегаты, объекты или чистые элементы данных, которые необходимо интерпретировать, прежде чем предпринимать действия. Важно то, что для того, чтобы действие происходило в потоке, сам поток должен выполнить это действие.

+0

Я полностью согласен, новый ConcurrentQueue в .net 4 был бы идеальным. http://msdn.microsoft.com/en-us/library/dd267265.aspx. Каждый поток должен иметь свою собственную очередь для чтения. Если поток планировщика хочет назначить специальную работу для рабочих потоков. Я бы действительно переосмыслил использование потоков и больше посмотрел на Задачи. – NPehrsson

Смежные вопросы