【问题标题】:Ansync thread from WCF RESTful Service来自 WCF RESTful 服务的异步线程
【发布时间】:2012-03-26 07:47:56
【问题描述】:

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

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

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

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

任何帮助都会很有价值。

【问题讨论】:

    标签: multithreading wcf


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我们更希望在服务器上运行一个进程,这样客户端就不会一直等待响应。更多的服务器端进程意味着即使客户端关闭也会执行。并且还会减少服务器上的流量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多