Рейтинг:
4
Christiaan van Bergen
Используйте то, что продолжает слушать. Метод Receive в MessageQueue сделает это.
Например:
var mq = new System.Messaging.MessageQueue(@".\Private$\SomeQueue");
while (mq.CanRead) // or any other loop condition
{
var msg = mq.Receive();
//do something with your message here
}
Метод Receive будет блокироваться до тех пор, пока сообщение не будет получено, после чего он удалит сообщение из очереди и вернет его.
ХТ христиан
Christiaan van Bergen
Имейте вокруг него петлю while-loop, иначе он все равно не будет продолжать прослушивание после обработки сообщения.
Member 11837253
- Добавил Я, но безуспешно. Я изменил код
общественности частичного класс service1 : например
{
private const string MqName = @".\private$\RequestQueue";
частная статический объект messagequeue _mq;
частная статический объект messagequeue МQ
{
получить
{
если (_mq == нуль)
{
если (!MessageQueue.Существует(MqName))
Объект messagequeue.Create(MqName);
_mq = new MessageQueue(MqName, QueueAccessMode.ReceiveAndAdmin);
_mq.Formatter = новый BinaryMessageFormatter();
}
вернуться _mq;
}
}
общественные службы service1()
{
метод InitializeComponent();
соток.ReceiveCompleted += новый ReceiveCompletedEventHandler(mq_ReceiveCompleted);
}
частная mq_ReceiveCompleted недействительным(объект отправителя, ReceiveCompletedEventArgs е)
{
MessageQueue cmq = (MessageQueue)отправитель;
пробовать
{
Сообщение сообщение = а.EndReceive(электронная.Asyncresult, к);
}
ловить
{
}
а.Освежить();
а.BeginReceive();
}
защищенное переопределение void OnStart(string[] args)
{
while(mq != null)
соток.BeginReceive();
}
частная MsMq_ReceiveCompleted недействительным(объект отправителя, ReceiveCompletedEventArgs е)
{
var msMq = (MessageQueue)отправитель;
ВАР МСГ = Майкрософт.EndReceive(электронная.Asyncresult, к);
служба msmq.BeginReceive();
}
охраняемых переопределить недействительными, то onStop()
{
if (mq != null)
соток.Закрывать();
вернуть;
}
}
Member 11837253
Служба Windows собирает сообщения только тогда, когда я ее запускаю, и после этого она перестает слушать
Christiaan van Bergen
Вы не реализуете код, который я вам показал. В вашем методе OnStart используйте mq.Receive(), я также объяснил, почему вы должны использовать этот метод. Попробуй, если это все еще не сработает, мы возьмем его оттуда.
Christiaan van Bergen
Нет, все правильно. Потому что вам нужно что-то сделать с реальным сообщением, которое вы получаете. Опять же, посмотрите на пример. Там написано: var msg = mq.Receive();
Так что сделайте что-нибудь с посланием.