【问题标题】: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(策略注入应用程序块)来完成工作。