来自WCF RESTful服务的异步线程

时间:2012-03-26 07:47:56

标签: multithreading wcf

我们为WPF(UI)应用程序创建了一个WCF RESTful服务。 UI向WCF服务发送请求,然后WCF服务在BLL中调用合适的方法,BLL又调用DAL中的方法。所有这些层都使用IOC / DI分离。

现在,对于一个新功能,我们希望当某个类型的新对象添加到数据库时,它应该经过3个步骤,这将在一个单独的线程中执行。

也就是说,如果服务向BLL发送请求以将新对象OBJ添加到数据库,则BLL应该通过DAL将对象保存到数据库中,然后启动新线程以对该对象执行某些操作而不阻塞WCF请求。

但是每当我们通过在BLL中启动一个新线程来尝试这样做时,应用程序就会崩溃。之所以如此,是因为数据库上下文的“InRequestScope”对象已被释放,并且线程无法更新数据库。在线程完成之前,WCF请求也不会结束,尽管已经提供了返回值并且BLL方法已经完成执行。

任何帮助都会受到重视。

2 个答案:

答案 0 :(得分:1)

我已经找到了这种行为的解决方案和解释。原来是一个相当愚蠢的人。

由于我是从BLL创建一个线程(使用IsBackground = true;),因此父线程(由服务请求发起)正在等待此线程结束。当两个线程都结束时,响应被发送回客户端。而且,解决方案,使用BackgroundWorker,而不是火箭科学,只是常识。

对于处理上下文,因为对象是InRequestScope,并且请求已经结束。因此,每次存储库需要UnitOfWork(uow / context)时,它都会生成一个新的上下文,并在数据库请求完成后立即结束。解决方案是,创建一个uow实例,存储在变量中,将其传递给需要使用的存储库,并强制所有存储库使用相同的uow实例,而不是为自己创建一个新的存储库。

答案 1 :(得分:0)

这似乎更像是客户端关注的问题,而不是服务方面的问题。为什么不让客户端向WCF服务发出异步请求,因为这会自动提供对服务的多线程访问。

内置的System.Net.WebClient(因为您访问webHttpBinding或WCF Web API端点)可以异步使用。这个blog post简要概述了它是如何完成的。虽然这个MSDN article似乎适用于文件I / O,大约四分之三,但是有关编码异步WebClient使用情况的详细说明。