2009-04-23 14 views
5

ここでは、この件について多くの議論がありました。C#と静的クラスと関数についての質問

静的なクラスを持つ静的メソッドがデータベースやサーバーに接続する場合、マルチユーザー環境(Webページなど)でこれを使用するのは悪い考えですか?これにより、新しいユーザのトレッドは、以前のユーザのスレッドが新しいものを受け入れる前にそのコールを終了するのを待つか?

マルチスレッドでこれがもたらす影響は何でしょうか?

Thx!

答えて

6

をスレッド上でのドキュメントのいくつかをチェックアウトして行くと言うでしょうメソッド呼び出しのスコープ内のリソース(共有状態なし)を使用している場合、インスタンスクラスを使用しないスレッドには問題はありません。しかし、大きな問題は、パブリックな静的メソッド(静的クラスまたは非静的クラス)に依存することにより、他の多くの設計上の問題が発生することです。

  • まず、実装に非常に緊密にバインドしていますが、これは常に悪いことです。
  • 第2に、静的メソッドに依存するすべてのクラスをテストすることは、単一の実装にロックされているため非常に難しくなります。
  • 第3に、静的メソッドは静的な状態(すべてのメソッド呼び出しで共有される)しか持てないため、スレッドセーフではないメソッドを作成するのは非常に簡単になります。
0

この質問で少し泣きました。なぜあなたは非常に静的な作業を続けているのですか?

しかし、私は、あなたが問題をスレッドについて尋ねていると思うので、私は、各静的メソッドは、そのリソースを取得し、そのを配置するための完全に責任がある場合 時間ttp://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx

0

スタティックは、メソッドが定義されているスコープと、バインド/コールされる方法のみを定義します。マルチスレッドとは関係ありません。

静的フィールドには注意が必要です。それらはすべてのスレッドによって共有されます。スレッドはお互いを待っているわけではありませんが、スレッドを動作させるにはロックが必要です。

しかし、アプリケーションがHello Worldよりも少し複雑な場合は、静的ではなくオブジェクト指向のパターンを使用することを検討する必要があります。

3

スタティックメソッドは、マルチスレッドに関して特別な動作をしません。つまり、メソッドの複数のコピーが同時に実行されることが期待できます。静的変数についても同じことが言えます。異なるスレッドが一度にそれらにアクセスすることができます。待機する必要はありません。そして、あなたが慎重でなければ、これは混乱を引き起こす可能性があります。

1

はい、それは悪い考えです。

誰かが必要とするアクションを実行する場合は、すべてのユーザーに対して1つの接続を使用すると、15秒を言うことができますが、単にデータベースアクセスのために、他のすべてのユーザーがいる場合、データベースに

+0

ここでの悪い考えは、静的メソッドIMOではなく、1つの接続の使用です。 –

+0

私はあなたに同意します – Sergio

0

を接続するために待機する必要があります1つの静的接続を使用してデータベースにアクセスすると、メソッド呼び出しを同期させる必要があります。単一の接続上でデータをデータベースに要求している複数のスレッドは... ehhmmm ...混乱させます。したがって、すべてのスレッドのデータアクセスをシリアル化しているため、パフォーマンスに大きな影響があります。

すべての呼び出しが独自の接続を開く場合は、共有接続がないため、すべてのスレッドをシリアル化する必要はありません。要求ごとに接続を作成することは、依然として高価な設計です。

静的接続プールを使用する場合は、接続プールへのアクセスをシリアライズするだけで済むので、このパフォーマンスへの影響は軽減されます。

さらに、統計は一般的に設計上の決定的なものではありません。ユニットテストは非常に複雑になります。 SingletonパターンまたはMonostateパターンの使用を検討する必要があります。

0

の場合は問題ありません。 を間違ってにすると、リソースへの強制的な強制的なアクセスが可能になります。

時々、右と間違いの違いは非常に微妙であり、見つけにくいかもしれませんが、主なものは、クラスの「状態」(メンバ)に依存したりロックしたりする方法はありません。

0

私は検索オブジェクトに静的メソッドを使用します。私はasp.netアプリケーションのための(キャッシュを使用して)1つの場所ですべてのルックアップオブジェクトを管理することができ、すべてのメソッドは静的メソッドを使用して呼び出します。

このようにすれば、必要なときにルックアップオブジェクトをインスタンス化する必要はなく、パフォーマンスを向上させるためにDBを呼び出す必要性が減ります。

関連する問題