2009-04-23 77 views
5

我在这里看到了很多关于这个主题的讨论。关于C#和静态类和函数的问题

如果我有一个静态类w /静态方法连接到数据库或服务器,在多用户环境(如网页)中使用它是一个坏主意?这是否会让新用户在接受新用户之前等待先前用户的线程完成其呼叫?

这对多线程的影响是什么?

Thx!

回答

6

如果每个静态方法是获取它的资源,然后处置其完全责任资源在方法调用的范围内(不共享状态),那么你不应该有线程问题,你不会使用实例类。然而,我会建议更大的问题是,依赖公共静态方法(静态或非静态类)会在后续创建许多其他设计问题。

  • 首先,你非常紧密地绑定到一个实现上,这个实现总是很糟糕。
  • 其次,测试依赖于静态方法的所有类变得非常困难,因为您被锁定到单个实现。第三,创建非线程安全的方法变得非常容易,因为静态方法只能有静态状态(这是在所有方法调用中共享的)。
0

静态只定义了方法定义的范围,以及它如何被绑定/调用。它与多线程无关。

你需要小心静态字段。它们由所有线程共享。线程不会彼此等待,但您需要锁定才能使其工作。

但是,如果你的应用比Hello World复杂一点,你应该考虑让你的方法不是静态的,而是使用面向对象的模式。

3

静态方法在多线程方面没有任何特殊的行为。也就是说,您可以期望同时运行该方法的多个“副本”。静态变量也是如此 - 不同的线程可以一次访问它们,不会在那里等待。除非你小心,否则会造成混乱。

1

是的,这是一个坏主意。

当您使用为所有用户一个连接,如果有人执行需要一个动作,可以说15秒,只用于数据库访问,其他所有用户都可以在为了等待连接到数据库

+0

这里的坏主意是使用一个连接,而不是静态方法,IMO。 – 2009-04-23 13:44:50

0

如果你使用一个静态连接来访问数据库,你将不得不同步方法调用。多个线程通过单个连接向数据库询问数据将会...... ehhmmm ......搞砸了。所以你正在序列化所有线程的数据访问,这会对性能产生很大的影响。

如果每个调用都打开自己的连接,则不需要序列化所有线程,因为没有共享连接。为每个请求创建连接仍然是一个昂贵的设计。

如果您使用静态连接池,您将减少此性能影响,因为您只需要序列化对连接池的访问。此外,静态一般不是一个好的设计决定 - 它们使得单元测试非常复杂。你应该考虑使用Singleton或Monostate模式。

0

如果你这样做,这不会是一个问题。如果你这样做错误,它有潜力强制顺序访问资源。

有时候,对与错的区别可能非常微妙,很难发现,但最主要的是没有方法应该依赖或锁定班级的任何“状态”(成员)。

0

我使用静态方法查找对象。我可以在一个位置管理所有查找对象(使用缓存),并且所有方法都使用静态方法调用它。

通过这种方式,我不需要在每次需要时都实例化查找对象,并且它可以减少调用数据库以提高性能的需求。