2009-04-28 83 views
2

我正在C#中开发一个.Net Compact框架应用程序,该应用程序使用设备上安装的一些第三方消息队列软件。.Net CF运行线程用于应用程序的生命周期

我是相当新的这个环境,并想知道如果我能运行架构过去的一些聪明的眼睛的几个关键概念,看看我在正确的轨道或者它如何可以改善上。

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

我不想淹没了这则讯息代码,所以我已经把我上认为重要的部分,请让我知道如果我需要澄清更多。

我启动消息过程在单独的线程在应用程序启动这样,

[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方法首先被调用并建立一个会话;我们将开始收到通知并能够发送消息。

当接收到消息时我目前管理经由线程池一个单独的线程事件处理中,为了继续和其他通知和响应消息。

这是否看起来合理的做法,将其确保我的消息队列库将能够从我的应用程序隔离处理?

任何意见将感激地收到,感谢您的时间。

回答

0

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

有几种情况时,后台线程可以停止操作:

  1. 整个应用程序已关闭(收到WM_CLOSE消息)
  2. 异常被抛出,并在后台线程上下文
  3. 操作系统有没有抓到由于内存限制而关闭整个应用程序

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

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

另一种方式是具有与环和隐藏的主窗口单独的应用程序。

0

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

相关问题