.Net CF运行线程,用于应用程序的生命周期

时间:2009-04-28 10:02:21

标签: .net multithreading compact-framework threadpool

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

我对这种环境还是比较陌生的,并且想知道我是否可以通过一些更明智的眼睛运行一些关于架构的关键概念,看看我是在正确的轨道上还是如何改进它。

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

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

当应用程序像这样启动时,我在一个单独的线程中启动Message Process,

[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在一个单独的线程中管理事件处理,以便继续并响应其他通知和消息。

这看起来是否合理,是否可以确保我的消息排队库能够独立于我的应用程序进行处理?

感谢你的时间,感激不尽。

2 个答案:

答案 0 :(得分:0)

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

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

  1. 整个申请已关闭(收到WM_CLOSE消息)
  2. 抛出了异常而未在后台线程上下文中捕获
  3. 由于内存限制,操作系统必须关闭整个应用程序
  4. 在您的代码中,您只能阻止条件编号2.

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

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

答案 1 :(得分:0)

似乎完全合理。我在实现方面做得有点不同,因为我通常使用DI框架,但概念本来是一样的。我要补充的一件事是将线程的IsBackground属性设置为true