2009-12-20 5 views
16

Что является наиболее эффективным и быстрым способом отправить сообщение в теме (не процесс), которые работают в то время как (1) цикл в C#/нетто:.Лучший способ отправить сообщение нить

  1. Использование синхронизированная очередь (такая как в Blocking Queues & Thread’s Communication in C#)

  2. Запуск цикла сообщений Использование Application.Run систем winforms в контексте потока и перед запуском application.run подписаться на событие, которое захватывает messsage в контексте потока.

  3. Использование сокета или именованного канала для отправки потоку сообщения.

В Linux Я привык делать это с помощью сокетов домена unix, что эквивалентный способ сделать это в Windows? обмен файлом памяти? именованный канал? Как вы думаете?

ответ

15

Я бы лично использовал очередь производителей/потребителей. Это действительно то, что представляет собой цикл сообщений WinForms, как раз в форме Windows Forms.

Обратите внимание, что если вы можете использовать .NET 4.0, в инфраструктуру встроены collections, которые делают это очень просто. В частности, использование BlockingCollection<T>, завернутое вокруг ConcurrentQueue<T>, будет делать то, что вы хотите.

Я бы лично использовать код GeeksCafe - я бы инкапсулировать производитель/потребитель природы в своем классе, который обручи очереди, а не лечения любой очереди таким образом с помощью методов расширения. В частности, вам нужно, чтобы все стороны правильно обрабатывали очередь, а это значит, что лучше дать ей собственный API на мой взгляд.

+0

класс производителей/потребителей, как в http://www.albahari.com/threading/part2.aspx? – Eyalk

+0

Спасибо Jon, будет ли очередь производителей/потребителей быстрее, чем именованный канал, для передачи сообщения? – Eyalk

+0

@Eyalk: Я подозреваю, что так, но сравните его, если вы особенно обеспокоены. Он имеет то преимущество, что ссылки на объекты можно передавать напрямую, а не именованный канал, который в основном заставит вас сериализовать/десериализовать. –