.NET 应用程序的按钮单击需要告诉外部服务从队列开始处理 (msmq)

Button click of .NET application needs to tell an external service to start processing from a queue (msmq)

我有一个 asp.net 用户将与之交互的网络表单应用程序。当用户从站点中选择某些项目并单击按钮进行处理时。 Web 应用程序将为用户选择的每个项目向 msmq 添加一条消息。

我想弄清楚的部分:

如果我的第二个应用程序的工作是处理队列 (msmq),它应该是什么类型的应用程序。关键是第二个应用程序需要闲置,直到我的 asp.net webapp 告诉它 'Process' 按钮被点击,然后它会继续,检查队列并处理它。我不希望它每分钟左右不断地检查队列,只在命令时检查队列。

Windows 服务,Web 服务,Web API?我目前有一个 Windows 服务,每 30 秒检查一次队列。我怎样才能让它按需工作而不是不断检查?

此处改写略有不同:

  1. 用户在 .NET 应用程序中并选择项目,然后单击处理。

  2. .Net应用程序添加需要处理的项目到队列(msmq).

  3. .NET 应用程序将通知其他应用程序单击了处理按钮,它应该开始处理队列。一旦处理完队列,附加应用程序应该返回某种空闲模式。

这里最重要的是,我不希望它出现在每分钟检查队列中是否有项目的计时器上。这将耗尽资源 运行 24/7.

可能是我对msmq的某些功能不熟悉。有没有一种方法可以让 msmq 告诉我的服务它收到了队列中的消息,继续处理它们。而不是我的 .net 应用程序与服务对话?

您可以使用现有的 Windows 服务。但是与其每 30 秒左右检查一次队列,为什么不向队列添加一个仅在消息到达时才响应的侦听器。请检查下面的代码段。

static void Main(string[] args)
{
    //create an event
    MessageQueue msmq = new MessageQueue("queuename");
    //subscribe to the event
    msmq.ReceiveCompleted += msmq_ReceiveCompleted;
    //start listening
    msmq.BeginReceive();
}

//this will be fired everytime a message is received
static void msmq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
    //get the MessageQueue that we used 
    MessageQueue msmq = sender as MessageQueue;

    //read the message
    //and process it
    Message msg = msmq.EndReceive(e.AsyncResult);

    //because this method is only fired once everytime
    //a message is sent to the queue
    //we have to start listening again            
    msmq.BeginReceive();
}