Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.Net CF在应用程序的生命周期内运行线程_.net_Multithreading_Compact Framework_Threadpool - Fatal编程技术网

.Net CF在应用程序的生命周期内运行线程

.Net CF在应用程序的生命周期内运行线程,.net,multithreading,compact-framework,threadpool,.net,Multithreading,Compact Framework,Threadpool,我正在用C语言开发一个.Net Compact framework应用程序,它使用安装在设备上的一些第三方消息队列软件 我对这种环境相当陌生,我想知道我是否可以通过一些更明智的眼光来运行一些关键的架构概念,看看我是否走在正确的轨道上,或者如何改进它 当我的应用程序运行时,我需要让消息队列库在后台运行,这样它就可以发出通知,通知我的应用程序任何传入的消息,并处理应用程序生成的消息。它需要在我的应用程序的整个生命周期中运行,所以我认为最好的方法是在我的应用程序启动时在它自己的线程中运行它 我不想让这

我正在用C语言开发一个.Net Compact framework应用程序,它使用安装在设备上的一些第三方消息队列软件

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

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

我不想让这篇文章充斥着代码,所以我把我认为重要的部分放在了上面,如果我需要进一步澄清,请让我知道

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

[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方法并建立会话;然后,我们将开始接收通知并能够发送消息

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

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


感谢您的时间,我们将非常感激您的建议。

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

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

整个应用程序已关闭,并收到WM_关闭消息 在后台线程上下文中引发了异常,但未捕获该异常 由于内存限制,操作系统必须关闭整个应用程序 在代码中,您只能防止条件2

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


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

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

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

整个应用程序已关闭,并收到WM_关闭消息 在后台线程上下文中引发了异常,但未捕获该异常 由于内存限制,操作系统必须关闭整个应用程序 在代码中,您只能防止条件2

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


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

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

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