MSMQ и опрашивающий для получения сообщения?

Для символов

Ваш терминал, скорее всего, использует символы Unicode (обычно в кодировке UTF-8), поэтому выбор подходящего шрифта для просмотра вашего любимого символа - это только вопрос. Я использую Unicode char U + 2588, «Полный блок».

Попробуйте следующее:

import unicodedata
fp= open("character_list", "w")
for index in xrange(65536):
    char= unichr(index)
    try: its_name= unicodedata.name(char)
    except ValueError: its_name= "N/A"
    fp.write("%05d %04x %s %s\n" % (index, index, char.encode("UTF-8"), its_name)
fp.close()

Изучите файл позже с вашим любимым зрителем.

Для цветов

curses - это модуль, который вы хотите использовать. Проверьте это учебник .

8
задан Pure.Krome 28 July 2009 в 19:21
поделиться

4 ответа

Если вы используете локальную очередь, вам не нужен WCF.

Вот как выглядит мой пример службы (класс службы из проекта службы Windows):

using System.Messaging;
public partial class MQProcessTest1 : ServiceBase
{
    //a name of the queue
    private const string MqName = @".\Private$\test1";
    //define static local private queue
    private static MessageQueue _mq;
    //lazy local property through which we access queue (it initializes queue when needed)
    private static MessageQueue mq
    {
        get
        {
            if (_mq == null)
            {
                if (!MessageQueue.Exists(MqName))
                    MessageQueue.Create(MqName);
                _mq = new MessageQueue(MqName, QueueAccessMode.ReceiveAndAdmin);
                _mq.Formatter = new BinaryMessageFormatter();
            }
            return _mq;
        }
    }

    //constructor
    public MQProcessTest1()
    {
        InitializeComponent();
        //event to process received message 
        mq.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
    }

    //method to process message
    private void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
    {
        //queue that have received a message
        MessageQueue cmq = (MessageQueue)sender;
        try
        {
            //a message we have received (it is already removed from queue)
            Message msg = cmq.EndReceive(e.AsyncResult);
            //here you can process a message
        }
        catch
        {
        }
        //refresh queue just in case any changes occurred (optional)
        cmq.Refresh();
        //tell MessageQueue to receive next message when it arrives
        cmq.BeginReceive();
    }

    protected override void OnStart(string[] args)
    {
        //let start receive a message (when arrives)
        if (mq != null)
            mq.BeginReceive();
        //you can do any additional logic if mq == null
    }

    protected override void OnStop()
    {
        //close MessageQueue on service stop
        if (mq != null)
            mq.Close();
        return;
    }
}
26
ответ дан 3 November 2019 в 14:03
поделиться

Похоже, вам необходимо изучить WCF.

Очереди в Windows Communication Foundation

Выравнивание нагрузки. Отправка заявок может перегрузить получающие приложения с сообщениями. Очереди могут управлять несоответствие составления сообщений и нормы потребления, чтобы приемник не перегружен.

Вот пример с использованием WCF и MSMQ

0
ответ дан 3 November 2019 в 14:03
поделиться

У меня сложилось впечатление, что MSMQ был создан для совместимости с продуктом IBM MQ. Если это , вы можете вызвать MQGET с таймаутом и вообще не беспокоиться об опросе.

Просто удалите сообщение из очереди с двухсекундным таймаутом (например). Если он там был, обработайте его. Затем либо выйдите из службы, если хотите, либо вернитесь к MQGET с ожиданием.

Это означает, что ваша служба не будет излишне потреблять процессорное время, но она все равно сможет своевременно завершить работу при получении сигнала.

Обычно , у вас будет что-то вроде:

Set up all queue stuff.
while true:
    Read from queue with 10-second timeout.
    If message was read:
        Process message
    If signaled to exit:
        break
Tear down queue stuff.
Exit.
1
ответ дан 3 November 2019 в 14:03
поделиться

Имейте в виду, что пример службы будет заблокирован при OnStart (). Вместо этого запустите рабочий поток:

    protected override void OnStart(string[] args)
    {
        IntPtr handle = this.ServiceHandle;
        myServiceStatus.currentState = (int)State.SERVICE_START_PENDING;
        SetServiceStatus(handle, ref myServiceStatus);

        // Start a separate thread that does the actual work.

        if ((workerThread == null) ||
            ((workerThread.ThreadState &
             (System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.Stopped)) != 0))
        {
            workerThread = new Thread(new ThreadStart(ServiceWorkerMethod));
            workerThread.Start();
        }

    }

затем вызовите BeginReceive () из рабочего.

0
ответ дан 3 November 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: