繁体   English   中英

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

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

我有一个与用户进行交互的asp.net Web窗体应用程序。 当用户从站点中选择某些项目并单击按钮进行处理时。 对于用户选择的每个项目,Web应用程序都会向msmq添加一条消息。

我要弄清楚的部分:

如果我的第二个应用程序的工作是处理队列(msmq),则它将是哪种类型的应用程序。 关键是第二个应用程序需要闲置,直到我的asp.net webapp告诉它单击了“处理”按钮,然后它将继续进行,检查队列并进行处理。 我不希望它每分钟左右不断检查队列,仅在命令时检查队列。

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM