繁体   English   中英

如何从WCF调用返回响应,然后执行更多工作?

[英]How can I return a response from a WCF call and then do more work?

我有一个同步Web服务调用,它返回一条消息。 我需要快速返回一条消息,基本上说已收到订单。 然后,我需要花费几分钟来处理订单,但不能长时间阻止该服务呼叫。 那么如何从Web服务返回,然后做更多事情呢? 我猜想我需要返回其他线程或其他东西,但是我不确定最好的方法。

string ProcessOrder(Order order)
{
  if(order.IsValid)
  {
      return "Great!";
      //Then I need to process the order
  }
}

您可以打开一个新线程,让它执行您需要的操作,而主线程返回的效果很好。

string ProcessOrder(Order order)
{
  if(order.IsValid)
  {
            //Starts a new thread
            ThreadPool.QueueUserWorkItem(th =>
                {
                    //Process Order here

                });

      return "Great!";
  }
}

您可以在单独的线程中开始大量工作

public string ProcessOrder(Order order)
{
   if(order.IsValid)
   {
        System.Threading.ParameterizedThreadStart pts = new System.Threading.ParameterizedThreadStart(DoHardWork);

        System.Threading.Thread t = new System.Threading.Thread(pts);
        t.Start(order);

        return "Great!!!";
   }
}

public void DoHardWork(object order)
{
//Stuff Goes Here
}

您正在做的工作“重要”吗? 我认为是。 您可以使用线程,但是如果计算机重新启动或asp.net worker进程回收,您的工作可能会被中断,您必须没事。 即使您已经告诉客户您已接受该工作,这也可能导致该工作无法完成。 这可能取决于您的用例。

我会考虑将您从同步服务请求中收到的工作项放入一个持久队列中。 一种简单的方法是使用翻译MSMQ队列。 您的同步服务将工作请求放入队列中,并且您有一些工作线程将工作请求从队列中拉出。 将队列读取和工作包装在事务中,直到工作完成才提交事务。 如果计算机或进程在请求过程中关闭,则下次启动时它将自动重新启动。

您还可以考虑利用PIAB(策略注入应用程序块)在方法调用后完成工作。

暂无
暂无

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

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