【问题标题】:How can I return a response from a WCF call and then do more work?如何从 WCF 调用返回响应,然后做更多工作?
【发布时间】:2009-05-11 16:22:01
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net wcf multithreading


    【解决方案1】:

    你可以打开一个新线程并让它做你需要的,而你的主线程返回很好。

    string ProcessOrder(Order order)
    {
      if(order.IsValid)
      {
                //Starts a new thread
                ThreadPool.QueueUserWorkItem(th =>
                    {
                        //Process Order here
    
                    });
    
          return "Great!";
      }
    }
    

    【讨论】:

      【解决方案2】:

      你可以在一个单独的线程中开始你的大量工作

      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
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-16
            • 1970-01-01
            • 1970-01-01
            • 2012-05-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多