[英]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.