【问题标题】:Concurrency ASP.NET best-practices worst-practices并发 ASP.NET 最佳实践 最差实践
【发布时间】:2009-03-24 18:39:54
【问题描述】:

在哪些情况下需要注意 ASP.NET 中的并发问题(例如使用锁)?

  • 是否有关于此主题的“最佳实践”
  • 文档?
  • 例子?
  • “最坏的做法...”或您见过的可能导致灾难的事情...?

我很好奇单例(尽管它们被认为是不好的做法 - 不要就此展开讨论)、静态函数(你需要在这里注意吗?)、...?

【问题讨论】:

  • 在我所知道的任何圈子里,单身人士都不被认为是不好的做法。
  • 好吧,如果你用谷歌搜索它,很多人会说不同的话。我们一直在 Flex/WPF/Silverlight 应用程序中使用它。然而,在 ASP.NET 中,它们不是瓶颈吗?
  • @Lieven 我同意 Rex 的观点,除非你对它们做错了什么,否则它们不是瓶颈——比如将它们设计为在像 asp.net 这样的场景中需要锁。就像你说的那样,这是一个不同的讨论。
  • 单身人士什么时候需要锁?如果两个线程在一个单例中调用一个函数,那不是总是有问题吗?还是每个线程都有自己的函数堆栈?那么函数中使用的静态变量呢?

标签: asp.net concurrency


【解决方案1】:

由于 ASP.NET 是一个 Web 框架并且主要是无状态的,因此需要解决的并发问题非常少。

我唯一需要处理的是管理应用程序缓存,但这很容易通过封装 .NET 缓存机制的缓存管理类型来完成。

【讨论】:

  • 好吧,除了数据库并发问题。 :)
【解决方案2】:

在我们的主 Web 服务中使用模块与类是一个让我们非常痛苦的大问题。这是在我们真正知道我们在做什么之前,并且已经修复。

使用模块的最大问题是,默认情况下,任何模块级变量对 ASP 工作进程的每个实例都是可见的。我们传入多个数据集并对其进行操作,然后将它们返回给客户端。因为我们使用的是模块,所以保存这些数据集的变量会被同时发生的多个调用破坏。

在我们弄清楚如何正确加载测试我们的 Web 服务之前,这并没有在测试中发现并且难以重现。在我们准确地重现它之前,每秒大约需要 10-20 个请求。

最后,我们只是将所有模块更改为类,然后使用这些类而不是对模块的调用,这解决了这个并发问题,因为每个实例化的类在内存中都有自己的数据集副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 2011-03-21
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    相关资源
    最近更新 更多