ASP.NET,C#:将锁块放在一个部分周围

时间:2010-01-12 07:39:28

标签: c# asp.net multithreading

我打算使用 lock()块围绕现有代码段(更新Hashtable),以防止多个线程(由ASP.NET网站启动)同时更新Hashtable。

B \ c这是我第一次采取这项措施,我需要你的建议

  1. lock()
  2. 引起的任何性能开销警告
  3. 您遇到的与此方案类似的任何其他问题。
  4. 我感谢任何建议。

3 个答案:

答案 0 :(得分:1)

锁定没关系,更好的方法是ReaderWriterLock(Slim)。允许在使用块中使用的Matt provides a nice wrapper

答案 1 :(得分:1)

lock()的最佳实践是确保锁定私有静态对象(请参阅here on MSDN了解原因)。我强烈建议您在沿着这条道路前阅读Threading Best Practices

通常情况下,lock()的性能开销不会比它阻塞的线程数多,而且频繁发生。您应确保了解应用程序的配置文件,以便最大限度地减少锁定行为。

我强烈建议您consider using the ASP.Net Application object进行简单的数据存储和更新,因为它已经有一个字典和特定的方法可用于这种同步存储。应用程序具有Lock()Unlock()方法,这些方法是为了处理线程阻塞和故障恢复而构建的,没有您可能通过滚动自己的同步代码遇到的AppDomain相关问题。一个例子是:

Application.Lock();
Application["SomeGlobalCounter"] = (int)Application["SomeGlobalCounter"] + 1;
Application.UnLock();

答案 2 :(得分:1)

除了上面的海报,我建议阅读ReaderWriterLockSlim

相关问题