Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 当多个客户端调用WCF服务时,是否在服务器端创建一个或多个AppDomains?_Multithreading_Wcf_Service_Appdomain_Shared Data - Fatal编程技术网

Multithreading 当多个客户端调用WCF服务时,是否在服务器端创建一个或多个AppDomains?

Multithreading 当多个客户端调用WCF服务时,是否在服务器端创建一个或多个AppDomains?,multithreading,wcf,service,appdomain,shared-data,Multithreading,Wcf,Service,Appdomain,Shared Data,这个问题基本上在标题中,但我会详细说明 我有一个Silverlight应用程序,它充当稍微扩展的用户界面 我的程序的主要部分将在服务器上运行,以保持共享数据库的一致性 这就是我的问题所在:两个调用WCF服务的客户机是各自在该服务中获得一个线程,还是各自获得一个完整的AppDomain 不同之处在于,如果第一种情况是这样,他们可以轻松地共享DB,但在第二种情况下,他们无法共享—正如我所理解的那样 编辑:这是因为DB使用了标识映射模式[Fowler],其中使用的对象保存在物理内存中(静态单例变量)—

这个问题基本上在标题中,但我会详细说明

我有一个Silverlight应用程序,它充当稍微扩展的用户界面

我的程序的主要部分将在服务器上运行,以保持共享数据库的一致性

这就是我的问题所在:两个调用WCF服务的客户机是各自在该服务中获得一个线程,还是各自获得一个完整的AppDomain

不同之处在于,如果第一种情况是这样,他们可以轻松地共享DB,但在第二种情况下,他们无法共享—正如我所理解的那样

编辑:这是因为DB使用了标识映射模式[Fowler],其中使用的对象保存在物理内存中(静态单例变量)——多个AppDomain会弄乱这一点


(在问这个看似简单的问题之前,我问了我的大学老师并搜索了很多。)

WCF服务的线程模型由您为服务配置的并发模式决定:

关于AppDomains-这完全取决于您如何托管服务。如果您手动运行自己的ServiceHost,则服务器端将始终只有一个AppDomain,除非您决定开始管理和启动自己的AppDomain

如果你是在IIS中托管的…这取决于IIS如何处理请求。它可能会重用1个AppDomain,可能会启动多个AppDomain(除非您覆盖web.config中的设置,以允许每个工作进程只允许1个AppDomain),或者如果启用了web garden模式,它可能会启动多个物理工作进程(这本质上意味着多个AppDomain)


综上所述,我不确定这究竟为什么会影响您的数据访问策略。多个线程或appdomain共享一个DB应该没有问题。

这个问题可能有某种关系,尽管我没有首先设置多个appdomain:每个传入请求都将获得自己的服务类新实例来处理请求(在默认的每次调用场景中)-但不是自己的appdomain,据我所知。因此,两个请求将是服务类的两个独立副本。因此,除非我特别选择IIS,否则将只有一个AppDomain,其中每个调用线程都可以访问与其他线程相同的单例?(我应该更准确地回答我的问题;我有一个ID映射模式正在进行-我对它进行了编辑)它实际上是一个或另一个:IIS或自托管…您必须始终选择。。。。在处理IIS时,由于我提到的原因,静态数据(或单例数据)通常是危险的。使用自托管,您只需要处理1个AppDomain,所以共享单例是没有问题的。