Thread-safe

sabato 26 maggio 2012 - 08.15
Tag Elenco Tags  C#  |  .NET 2.0  |  .NET 3.0  |  .NET 3.5  |  .NET 4.0  |  Visual Studio 2010  |  Visual Studio Express

andrestu Profilo | Expert

salve a tutti,
per un sito web che sto sviluppando utilizzo un componente che gestisce l'upload (cute web ajax upload), nella relativa documentazione di una delle classi che formano questo componente trovo la seguente scritta:

Public static members of this type are safe for multithreaded operations. Instance members are not guaranteed to be thread-safe.

non essendo pratico di thread e relativa gestione non so interpretarla, qual'è il suo significato?
grazie...

Andrea Restucci - Web Developer

luigidibiasi Profilo | Guru

>Public static members of this type are safe for multithreaded
>operations. Instance members are not guaranteed to be thread-safe.
>

ti dice che i membri pubblici della classe devono essere gestiti tramite i lock manualmente poiché non sono thread-safe
quindi, in pratica se usi più thread che vanno ad usare un oggetto condiviso potrebbero accadere guai
(i metodi vanno utilizzati da un thread per volta in mutua esclusione)


se utilizzi più thread assicurati di utilizzare SynLock sull'oggetto (se usi VB) prima di richiamarne i metodi...
Se usi c# crei un lock globale e lo usi prima di ogni chiamata a metodo di quella classe

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

andrestu Profilo | Expert

Grazie della risposta,
ma vorrei capirci meglio.

L'oggetto in questione è un controllo adibito al upload, il controllo espone degli eventi che vengono utilizzati per gestire il processo di upload, quindi all'interno di questi eventi posso accedere ai file uploadati (concedimi il termine) e alle relative proprietà.
A questo punto deduco che se è un controllo viene inizializzato insieme al resto della pagina e quindi non dovrebbe essere un oggetto condiviso giusto?

Andrea Restucci - Web Developer

luigidibiasi Profilo | Guru

>L'oggetto in questione è un controllo adibito al upload, il controllo
>espone degli eventi che vengono utilizzati per gestire il processo
>di upload, quindi all'interno di questi eventi posso accedere
>ai file uploadati (concedimi il termine) e alle relative proprietà.
fin qui ok

il problema può nascere in diversi casi:
- hai più thread che richiamano i metodi dell'oggetto in contemporanea. Questa eventualità è possibilissima, basta che due utenti iniziano ad uploadare due file in contemporanea.
- hai più thread che vanno a "modificare" (non a leggere) le proprietà nell'oggetto.
da come presumo, gli eventi ti servono per determinare lo stato dell'upload giusto?

>A questo punto deduco che se è un controllo viene inizializzato
>insieme al resto della pagina e quindi non dovrebbe essere un
>oggetto condiviso giusto?

Se il controllo è messo nella pagina "dovrebbe" risultare privato e quindi legato alla singola sessione utente. (e non darti problemi)
Però, tu non sai come è stato realmente implementato internamente (potrebbe far riferimento ad esempio sempre allo stesso buffer temporaneo)... e dato che esce fuori quel messaggio ti conviene usare un lock (tanto a meno di non prevedere centinaia di upload al secondo non ti degrada le prestazioni)

>>MOD:
SCUSAMI:
ho riletto solo ora bene

>Public static members of this type are safe for multithreaded operations.
quindi è thread safe se usato staticamente!!

>Instance members are not guaranteed to be thread-safe.
tu mica fai tipoOggetto x = new tipoOggetto() per usarlo?




Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

andrestu Profilo | Expert


allora, io non costruisco l'oggetto da code-behind ma lo inserisco all'interno della pagina Aspx come tutti gli altri controlli.

- inserire un controllo nella pagina aspx (per capirci <asp:button runat="server" ...) oppure tramite code-behind (Button mybutt = new Button();) non è la stessa cosa?
alla fine viene sempre chiamato il costruttore per l'inizializzzione dell'oggetto giusto?

- è possibile che in questo caso l'implementazione del controllo è un oggetto statico? in questo caso avrebbero senso le indicazioni...

- altra cosa è che i file vengono temporaneamanete salvati con un nome costruito da un guid + nome reale del file, quindi presumo che siano state previste operazioni multi-thread contemporanee...



Andrea Restucci - Web Developer
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5