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
C# 带有InstanceContextMode.PerCall的WCF服务文件锁定_C#_Wcf_Filestream_Application Pool_Instancecontextmode - Fatal编程技术网

C# 带有InstanceContextMode.PerCall的WCF服务文件锁定

C# 带有InstanceContextMode.PerCall的WCF服务文件锁定,c#,wcf,filestream,application-pool,instancecontextmode,C#,Wcf,Filestream,Application Pool,Instancecontextmode,正如标题已经让你感到疑惑的那样,这难道不应该被视为是一种排他性的或非排他性的行为吗? 按照我理解PerCall的方式,每个新请求都应该创建一个新的服务对象,以及一组新的变量,等等。 那么,文件上的锁怎么可能仍然存在呢 想象一下,文件在请求#1期间没有被适当地关闭,对象不应该在请求#1结束时被处理掉巨大的服务对象吗? 或者,文件上的锁可能不在服务对象手中,而是在Windows api内部机制的深处,在某种程度上,随着请求#1的结束,文件锁仍然存在(没有发生正确的关闭),锁仍然存在?在回收应用程序池

正如标题已经让你感到疑惑的那样,这难道不应该被视为是一种排他性的或非排他性的行为吗? 按照我理解PerCall的方式,每个新请求都应该创建一个新的服务对象,以及一组新的变量,等等。 那么,文件上的锁怎么可能仍然存在呢

想象一下,文件在请求#1期间没有被适当地关闭,对象不应该在请求#1结束时被处理掉巨大的服务对象吗? 或者,文件上的锁可能不在服务对象手中,而是在Windows api内部机制的深处,在某种程度上,随着请求#1的结束,文件锁仍然存在(没有发生正确的关闭),锁仍然存在?在回收应用程序池后,锁已被解除,但InstanceContextMode.PerCall的设置不应该具有相同的效果吗


如果能对这种现象做出任何技术解释,我将不胜感激。我必须给它贴上标签。我们不能打电话给安德鲁·S·塔南鲍姆,每次我们都不能处理这种问题,你同意吗?但我想了解这类问题的内在原因。

如果文件没有正确关闭(在使用后,或者至少在服务对象的dispose方法中),那么它只会在下次垃圾收集时关闭,而下次垃圾收集可能随时发生。问题是-为什么不适当地关闭它呢?是的,这就是我要做的,@Evk,谢谢你,但之前我对这种行为的原因很感兴趣。您提到了GC,如果我能够正确理解上下文,我会同意这一点:我认为,由于PerCall注释,堆将在每个请求时更新,因此GC将从零开始。我需要在w3p工作进程、应用程序池、进程、CLR、GC、文件句柄的上下文中理解注释。不,不会发生这种情况。它将在每次调用时执行newyourservice(),并在最后对该实例(如果有)调用Dispose。基本上就是这样。在每个请求上更新堆对Web服务器来说效率非常低,这肯定是不可能发生的事情。我明白了,因此在请求结束时,具有打开的文件句柄的FileStream对象将不再有引用,仍然对文件有锁,稍后会被GC’ed,使用FileStream.Finalize调用关闭FileStream。调用new YourService()只会将服务变量重置为默认值。是的,这是正确的。