2009-04-23 7 views
5

Ho visto molte discussioni su questo argomento qui.Una domanda su C# e classi e funzioni statiche

Se si dispone di una classe statica con metodi statici che si collega a un database oa un server, è una cattiva idea utilizzarla in un ambiente multiutente (come una pagina Web)? Questo farebbe sì che il battistrada di un nuovo utente attenda che i thread degli utenti precedenti finiscano le loro chiamate prima di accettarne uno nuovo?

Quali sarebbero le implicazioni di questo con multi-threading, anche?

Thx!

risposta

6

Se ogni metodo statico è pienamente responsabile per l'acquisizione delle sue risorse e quindi lo smaltimento sua le risorse nell'ambito della chiamata al metodo (nessuno stato condiviso), quindi non si dovrebbe avere alcun problema con il threading che non si avrebbe utilizzando le classi di istanza. Suggerirei, tuttavia, che il problema più grande è che il ricorso a metodi statici pubblici (in classi statiche o non statiche) crea molti altri problemi di progettazione lungo la strada.

  • Prima di tutto, si sta vincolando molto strettamente a un'implementazione, che è sempre negativa.
  • In secondo luogo, testare tutte le classi che dipendono dai metodi statici diventa molto difficile da eseguire, poiché si è bloccati su una singola implementazione.
  • In terzo luogo, diventa molto facile creare metodi non thread-safe poiché i metodi statici possono avere solo uno stato statico (condiviso da tutte le chiamate di metodo).
0

Un po 'strano per questa domanda. Per quanto riguarda il motivo per cui hai così tanta elettricità statica.

ma penso che tu stai chiedendo problemi di threading, quindi direi andare a controllare alcuni dei documenti sulla filettatura h ttp://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx

0

Statico definisce solo l'ambito in cui è definito il metodo e come viene associato/chiamato. Non ha nulla a che fare con il multi threading.

È necessario fare attenzione con i campi statici. Sono condivisi da tutti i thread. I thread non si aspettano l'un l'altro, ma hai bisogno di serrature per farlo funzionare.

Ma se la tua applicazione è un po 'più complessa di Hello World, dovresti considerare di avere metodi non statici ma di utilizzare modelli orientati agli oggetti.

3

I metodi statici non hanno alcun comportamento particolare rispetto al multithreading. Cioè, puoi aspettarti diverse "copie" del metodo in esecuzione contemporaneamente. Lo stesso vale per le variabili statiche: diversi thread possono accedervi tutti in una volta, non c'è da aspettarsi lì. E a meno che tu non stia attento, questo può creare il caos.

1

Sì, è una cattiva idea.

Quando si utilizza una connessione per tutti gli utenti, se qualcuno compie un'azione che richiede, diciamo 15 secondi, solo per l'accesso al database, tutti gli altri utenti dovranno attendere per la connessione al database

+0

L'idea sbagliata è l'uso di una connessione, non i metodi statici, IMO. –

+0

Sono d'accordo con te – Sergio

0

Se si utilizza una connessione statica per accedere al database, sarà necessario sincronizzare le chiamate di metodo. Più thread che richiedono il database per i dati su una singola connessione ... ehhmmm ... rovinano le cose. Quindi stai serializzando l'accesso ai dati di tutti i thread e questo avrà un grande impatto sulle prestazioni.

Se ogni chiamata apre la propria connessione, non è necessario serializzare tutti i thread perché non esiste una connessione condivisa. Creare una connessione per richiesta è ancora un progetto costoso.

Se si utilizza un pool di connessioni statiche si riduce l'impatto sulle prestazioni poiché è necessario serializzare l'accesso al pool di connessioni.

Inoltre, la statica non è in genere una buona decifrazione di progettazione: rendono molto complicata la verifica dell'unità. Si dovrebbe considerare l'utilizzo del pattern Singleton o Monostate.

0

Se lo si fa a destra, non sarà un problema. Se lo fai, errato, ha il potenziale accesso sequenziale alla risorsa.

A volte la differenza tra giusto e sbagliato può essere molto sottile e difficile da individuare, ma la cosa principale è che nessun metodo deve fare affidamento su o bloccare alcun "stato" (membri) della classe.

0

Uso il metodo statico per gli oggetti di ricerca. Posso gestire tutti gli oggetti di ricerca in un unico posto (usando la cache) per l'applicazione asp.net e tutti i metodi lo chiamano usando il metodo statico.

In questo modo, non ho bisogno di istanziare gli oggetti di ricerca ogni volta che ne ho bisogno e riduce la necessità di chiamare DB per il miglioramento delle prestazioni.