Logo UGIdotNET

Discussione 'Variabili shared nei moduli'

# Pubblicato il 04 nov 2003 8.46 - Rispondi
Stefano Ottaviani
Variabili shared nei moduli
Ciao a tutti, ho un problema che non so se si riesce a risolvere data la natura del .net framework.
In vb6 se si creava una dll dotata di una classe (ad esempio CPersona) ed un modulo con delle variabili globali (come ad esempio la variabile per l'istanza della connessione al database), quando si creavano su un altro programma due o più istanze della classe (in questo caso CPersona) le variabili globali del modulo rimanevano comunque indipendenti tra le varie istanze (per cui in questo esempio le variabili per la connessione al database erano indipendenti, e alla creazione di ogni istanza di CPersona la connessione veniva inizializzata correttamente).
Cercando di fare una cosa analoga in vb.net, invece, succede che posso creare sempre la DLL con la classe CPersona ed il modulo con le variabili globali (come la connessione al database), ma, data la natura shared delle variabili nel modulo, quando da un altro programma creo due istanze della classe CPersona le variabili del modulo vengono condivise anche tra le varie istanze, ed in questo caso quando faccio la prima istanza posso aprire la connessione mentre quando creo la seconda istanza non devo aprirla in quanto condivide la stessa variabile di connessione con l'altra istanza, ed inoltre non posso accedere contemporaneamente ad un metodo delle due istanze (magari da thread differenti) che esegue ad esempio una query in quanto per la prima istanza lo esegue correttamente, ma per la seconda istanza mi darebbe un errore in quanto la variabile di connessione, in questo caso condivisa tra le varie istanze, sta ancora eseguendo la query per la prima istanza.
Qualcuno sa se si riesce ad ottenere un comportamento di "indipendenza" delle variabili dei moduli per le varie istanze della classe analogo a quello del vb6? Ciò sarebbe molto utile sia per evitare di serializzare molte procedure con il synclock, sia in quanto dovendo poter creare molte istanze della classe si avrebbe una perdita di prestazioni se molte procedure sono serializzate e non sono quindi indipendenti tra le varie istanze.
# Pubblicato il 04 nov 2003 9.14 - Rispondi
Corrado Cavalli
Re: Variabili shared nei moduli
Hai gia' dato un occhiata all'attributo ThreadStatic?, non ho mai provato quindi potrebbe non essere quello che ti serve

HTH
Corrado
# Pubblicato il 04 nov 2003 19.16 - Rispondi
Luca Dormio
Re: Variabili shared nei moduli
on 4. Nov 2003 08:46 Stefano Ottaviani wrote:
> Ciao a tutti, ho un problema che non so se si riesce a risolvere data la natura
> del .net framework.
> In vb6 se si creava una dll dotata di una classe (ad esempio CPersona) ed un
> modulo con delle variabili globali (come ad esempio la variabile per l'istanza
> della connessione al database), quando si creavano su un altro programma due o
> più istanze della classe (in questo caso CPersona) le variabili globali del
> modulo rimanevano comunque indipendenti tra le varie istanze
[SNIP]

Se ho interpretato bene, questo non succede nemmeno in VB6; se le due istanze vengono create da un <b>unico</b> programma esterno, le variabili globali dichiarate nel modulo sono condivise, esattamente come succede in VB.NET

Se invece le istanze differenti vengono create da piu' istanze del programma esterno, o da programmi diversi, allora le variabili globali sono autonome per ciascun client, esattamente come succede in VB.NET

Ciao
# Pubblicato il 04 nov 2003 10.25 - Rispondi
Stefano Ottaviani
Re: Variabili shared nei moduli
Ho provato come mi hai detto, ma purtroppo non mi ha funzionato. Comunque se vuoi fare una prova anche tu, una classe d'esempio da inserire nella DLL potrebbe essere questa:

Public Class Persona

Dim m_Cognome As String

Public Property Nome() As String
Get
Return m_Nome
End Get
Set(ByVal Value As String)
m_Nome = Value
End Set
End Property

Public Property Cognome() As String
Get
Return m_Cognome
End Get
Set(ByVal Value As String)
m_Cognome = Value
End Set
End Property

Public Property Eta() As Integer
Get
Return m_Eta
End Get
Set(ByVal Value As Integer)
m_Eta = Value
End Set
End Property

End Class

Public Module modGeneral

Public m_Eta As Integer

<ThreadStatic()> _
Public m_Nome As String

End Module

Le variabili m_Eta e m_Nome vorrei che fossero indipendenti tra le varie istanze create nel programma (ho provato a mettere ThreadStatic, o ad usare invece di un modulo una classe con i membri shared), ma non sono riuscito ad ottenere ciò
# Pubblicato il 04 nov 2003 21.20 - Rispondi
Stefano Ottaviani
Re: Variabili shared nei moduli

> Se ho interpretato bene, questo non succede nemmeno in VB6; se le due istanze
> vengono create da un <b>unico</b> programma esterno, le variabili globali dichiarate
> nel modulo sono condivise, esattamente come succede in VB.NET
>
> Se invece le istanze differenti vengono create da piu' istanze del programma
> esterno, o da programmi diversi, allora le variabili globali sono autonome per
> ciascun client, esattamente come succede in VB.NET
>
> Ciao

Non so come compili il programma in vb6, ma le variabili globali in vb6 mi rimangono indipendenti sia se creo due istanze dallo stesso programma (a differenza di come dici tu), sia da programmi differenti (come dici anche tu).

Inoltre il problema più grande che ciò mi comporta è nello sviluppare componenti dal vecchio DCOM in .net remoting.
In DCOM, impostandolo per creare una nuova istanza dell'oggetto x ogni client che vuole accederci ho, analogamente, le variabili contenute nei moduli separate tra le varie istanze.
In .net remoting, condividendo l'oggetto come Client Activated (CAO), creo dell'oggetto condiviso (che potrebbe essere in questo esempio la classe Persona) una istanza per ogni client, ma le variabili nei moduli rimangono condivise tra le varie istanze con le relative conseguenze (serializzazione delle procedure, ...)
# Pubblicato il 04 nov 2003 23.13 - Rispondi
Luca Dormio
Re: Variabili shared nei moduli
on 4. Nov 2003 21:20 Stefano Ottaviani wrote:
> Non so come compili il programma in vb6, ma le variabili globali in vb6 mi rimangono
> indipendenti sia se creo due istanze dallo stesso programma (a differenza di come dici
> tu), sia da programmi differenti (come dici anche tu).

Io intendevo una normale DLL ActiveX; per esempio con una classe MultiUse e una unica property
<code>
Public Property Get Value() As Integer
Value = GlobalValue
End Property

Public Property Let Value(ByVal NewValue As Integer)
GlobalValue = NewValue
End Property
</code>

e in un modulo BAS
<code>
Public GlobalValue As Integer
</code>

da un client
<code>
'due istanze della stessa classe
Dim o1 As New ClasseDLL
Dim o2 As New ClasseDLL

'un unico let
o1.Value = 123
debug.print o1.Value; o2.Value
'entrambe le istanze leggono l'unica variabile condivisa
</code>

> Inoltre il problema più grande che ciò mi comporta è nello sviluppare componenti dal
> vecchio DCOM in .net remoting.

Se parliamo di DCOM allora puo' essere, non l'ho mai "frequentato" molto, ma un normale componente COM in-process si comporta come sopra.

Ciao
# Pubblicato il 05 nov 2003 14.13 - Rispondi
Stefano Ottaviani
Re: Variabili shared nei moduli

> Io intendevo una normale DLL ActiveX; per esempio con una classe MultiUse e una unica
> property
> <code>
> Public Property Get Value() As Integer
> Value = GlobalValue
> End Property
>
> Public Property Let Value(ByVal NewValue As Integer)
> GlobalValue = NewValue
> End Property
> </code>
>
> e in un modulo BAS
> <code>
> Public GlobalValue As Integer
> </code>
>
> da un client
> <code>
> 'due istanze della stessa classe
> Dim o1 As New ClasseDLL
> Dim o2 As New ClasseDLL
>
> 'un unico let
> o1.Value = 123
> debug.print o1.Value; o2.Value
> 'entrambe le istanze leggono l'unica variabile condivisa
> </code>
>
> > Inoltre il problema più grande che ciò mi comporta è nello sviluppare componenti dal
> > vecchio DCOM in .net remoting.
>
> Se parliamo di DCOM allora puo' essere, non l'ho mai "frequentato" molto, ma un normale
> componente COM in-process si comporta come sopra.
>
> Ciao

Ho rifatto una prova con una dll normale in vb6 ed effettivamente è come dici tu, adesso non ricordo se l'altra volta avevo istanziato un componente con DCOM o avevo impostato in qualche modo qualcosa che mi aveva fatto ottenere ciò.
Comunque, in vb.net è possibile in qualche modo ottenere ciò che volevo, magari tramite qualche attributo (con ThreadStatic ho provato ma non ho ottenuto ciò che volevo)?

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185