我有
下的WebAPI方法[HttpPost]
[Route("AddSubProduct")]
public string InsertSubProduct(SubProduct subproduct)
{
try
{
subProductRepository.InsertSubProduct(subproduct);
// This message must be returned to the client application as soon
// as the product is created
subproduct.ToString();
// This will happen parallely
DoSomethingElse(subproduct);
}
catch (Exception ex)
{
throw ex;
}
}
可以看出,subproduct.Tostring()
将首先立即发送到客户端应用程序(一旦创建产品), DoSomethingElse 将独立工作(尽管当前的实现是不是那样的,我们必须这样做)。可以想象我不能在这里使用 return语句。
我将如何做到这一点?
答案 0 :(得分:1)
您需要在后台线程上排队工作。如果您使用的是.NET 4.5.2,我建议您使用HostingEnvironment.QueueBackgroundWorkItem
。如果您使用的是先前版本,请使用BackgroundTaskManager
。两者都将使用ASP.NET运行时注册他们的工作:
[HttpPost]
[Route("AddSubProduct")]
public string InsertSubProduct(SubProduct subproduct)
{
subProductRepository.InsertSubProduct(subproduct);
HostingEnvironment.QueueBackgroundWorkItem(cancellationToken =>
DoSomethingElse(subproduct));
return subproduct.ToString();
}
如果您经常使用并发请求进行此操作,则应考虑排队并让单个线程出列并处理它们。如果持久性在这里很重要,那么您需要选择不同的路线。
附注 - 不要捕捉您无法处理的异常。特别是,不要使用throw ex
,你就会失去堆栈跟踪。