如何从WCF调用返回响应然后再做更多工作?

时间:2009-05-11 16:22:01

标签: c# .net wcf multithreading

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

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

4 个答案:

答案 0 :(得分:5)

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

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

                });

      return "Great!";
  }
}

答案 1 :(得分:3)

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

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
}

答案 2 :(得分:1)

你正在做的工作“重要吗?”我认为是。您可以使用一个线程,但是如果机器重新启动或者如果asp.net工作进程重新循环,您可能必须确定您的工作可能会被中断。即使您已经告诉客户您已接受它,这可能会导致工作无法完成。这可能与否取决于您的使用案例。

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

答案 3 :(得分:1)

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