장치에 설치된 타사 메시지 큐 소프트웨어를 사용하는 .NET Compact Framework 응용 프로그램을 C#으로 개발 중입니다.응용 프로그램의 평생 동안 닷넷 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 메서드는 먼저 호출되어 세션을 설정합니다. 그러면 알림을 받고 메시지를 보낼 수있게됩니다.
메시지를 받으면 나는 현재 다른 알림 및 메시지에 계속 응답하기 위해 ThreadPool을 통해 별도의 스레드에서 이벤트 처리를 관리하고 있습니다.
이 방법이 합리적인 방법으로 보이고 내 메시지 대기 라이브러리가 내 응용 프로그램과 별도로 처리 할 수 있습니까?
감사의 말을 들어 주시면 감사하겠습니다.