2

我正在用 C# 开发一个 .Net Compact 框架应用程序,它利用设备上安装的一些第三方消息队列软件。

我对这个环境相当陌生,想知道我是否可以通过一些更明智的眼睛运行架构的一些关键概念,看看我是否走在正确的轨道上或如何改进它。

在我的应用程序运行时,我需要保持消息队列库在后台运行,以便它可以发出通知并通知我的应用程序任何传入消息并处理我的应用程序生成的消息。它需要在我的应用程序的整个生命周期中运行,所以我认为最好的方法是在我的应用程序启动时在自己的线程中运行它?

我不想用代码淹没这篇文章,所以我把我认为重要的部分放在了上面,如果我需要澄清更多,请告诉我。

当应用程序像这样启动时,我在单独的线程中启动消息进程,

[MTAThread]
static void Main()
{
    //Run the message processor in its own thread
Thread messagingThread = new Thread(new ThreadStart(msgProcessorStart));
messagingThread.Priority = ThreadPriority.Highest;
messagingThread.Start();

…..
Application.Run(splashForm);
}

private static void msgProcessorStart()
{
MessageProcessor.Start();                      
}

MessageProcessor 是消息传递库的一个外观,用于简化交互并保留它的单个实例。我在下面发布了其中的一部分,它会引发未送达事件并在收到消息时通知。

public static class MessageProcessor
    {
        #region Declarations

//private static reference to the MessageProvider as specified in the configuration files.
private static readonly IMessageProcessor _messageProcessor = MessageAccess.MessageProvider;

        #endregion

        #region Constructor

        /// <summary>
        /// Static constructor, connects to the events on the messageProcessor instance which 
        /// relate to messages received, notifications received and exceptions raised.
        /// </summary>
        static MessageProcessor()
        {
            //Connect up events specifed on the IMessageProcessor interface. 
            _messageProcessor.MessageReceived += messageReceived; 
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// Sends a request based data message.
        /// </summary>
        /// <typeparam name="T">Message which implements RequestBase</typeparam>
        /// <param name="message">The message to send</param>
        public static void SendMessage<T>(T message) where T : RequestBase
        {
            _messageProcessor.SendMessage(message);
        }

        /// <summary>
        /// Starts the Message Processor. 
        /// </summary>
        /// <returns>bool, true if started successfully.</returns>
        public static void Start()
        {
            _messageProcessor.Start();
        }

        #endregion

        #region Private methods

        //Registered listener of the IMessageProcessor.MessageReceived event
        private static void messageReceived(object sender, MsgEventArgs<IMessage> message)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(processMessage),(object)message.Value);
        }


        //Invoked via messageReceived.
        private static void processMessage(object msg)
        {            
            //process the message
        }

        #endregion
    }

首先调用 Start 方法并建立会话;然后我们将开始接收通知并能够发送消息。

收到消息后,我目前正在通过 ThreadPool 在单独的线程中管理事件处理,以便继续并响应其他通知和消息。

这看起来是一种合理的方法吗?它能否确保我的消息队列库能够独立于我的应用程序进行处理?

任何建议将不胜感激,感谢您的时间。

4

2 回答 2

0

从概念上讲,将其放入单独的线程中是正确的选择。

后台线程可以停止运行有几种情况:

  1. 整个应用程序已关闭(收到 WM_CLOSE 消息)
  2. 抛出异常并且未在后台线程上下文中捕获
  3. 由于内存限制,操作系统必须关闭整个应用程序

在您的代码中,您只能防止条件编号 2。

另一方面,如果您想要完美的隔离,您可以编写一个 Windows 服务并将其安装在设备上。但我认为没有原生可用的 .NET CF 服务。然而,有一些实现可以用来克服这个障碍。

另一种方法是使用带有该循环和隐藏主窗口的单独应用程序。

于 2011-06-28T08:32:20.970 回答
0

似乎完全合理。因为我通常使用 DI 框架,所以我在实现上做了一些不同的事情,但概念是一样的。我要添加的一件事是将IsBackground线程的属性设置为true.

于 2011-06-28T14:00:42.930 回答