Concurrency ASP.NET best-practices worst-practices
在哪些情况下,您需要注意ASP.NET中的并发问题(例如,使用锁)?
- 在这个主题上是否有"最佳实践"
- 文档?
- 例子?
- "最坏的做法……"或者你所看到的可能导致灾难的事情……?
我很好奇,例如单例(尽管它们被认为是不好的实践——不要就此展开讨论),静态函数(您需要注意这里吗?),……?
由于ASP.NET是一个Web框架,主要是无状态的,所以很少有需要解决的并发问题。
我唯一需要处理的事情就是管理应用程序缓存,但这很容易通过包装.NET缓存机制的缓存管理类型完成。
一个巨大的问题导致了我们的痛苦,那就是在我们的主要Web服务中使用模块和类。这是在我们真正知道我们在做什么之前,并且已经被修复了。
使用模块的最大问题是,默认情况下,任何模块级变量对ASP工作进程的每个实例都是可见的。我们传入多个数据集并对其进行操作,然后将它们返回到客户机。因为我们使用的是模块,保存这些数据集的变量会被一次发生的多个调用损坏。
这在测试中没有被发现,在我们弄清楚如何正确地加载测试我们的Web服务之前很难重现。在我们能够准确地复制它之前,它每秒需要大约10-20个请求。
最后,我们将所有模块都改为类,然后使用这些类而不是对模块的调用,这消除了并发性问题,因为每个实例化的类在内存中都有自己的数据集副本。