Javier

 

Como primera medida, la idea era que no uses una colección shared. Con esta
implementación de Singleton no necesitás nada shared más allá de lo que te
pasé en el patrón.

La idea es que implementes una instancia privada de una collection que viva
junto con tu singleton. 

Podrías también implementarlo con una collection Shared, pero justamente
para no hacer eso estás implementando el patrón Singleton que te garantiza
UNA instancia y no ninguna. 

 

Como segunda medida, dije collection de forma genérica, pero habría que ver
qué querés almacenar ahí (si tu objeto artículo, si el artículoId como
String, etc) y la cantidad de pedidos concurrentes que esperás (es decir,
cuán grande puede ponerse la collection), porque depende del caso podés
implementar cosas más optimas (HashTable, HibridDictionary, o hasta una
DataTable con tu ArticuloId como clave primaria, etc). Cuando dije
Collection quise decir cualquier tipo de listado de tus bloqueos activos.

 

Como tercera medida, la idea es exactamente que ese listado tenga el mismo
ciclo de vida que la WebApplication, es decir, que no importa cuantos
clientes se conecten, desconecten, cuelguen, cierren IE, o se les caiga la
session… tu Singleton siempre debe mantener esa collection viva aunque sea
vacía. Fijate que el bloqueo y desbloqueo no depende del Session_OnStart o
Session_OnEnd, sino que la operación de bloqueo y desbloqueo con toda tu
operación de consulta e inserción en medio se produce en un mismo thread en
tu servidor con la llamada al método guardar. Esto quiere decir que es
imposible que aunque a un cliente se le cuelgue la máquina te quede
bloqueado algún artículo. De hecho el bloqueo debería durar unos
milisegundos. Me parece, si no entendí mal, que con tus pruebas lo que estás
esperando es que cuando un cliente se desconecte desparezca su registro en
la collection o toda la collection no?

 

Espero te sirva.

Saludos cordiales, 

Leonardo

 

 

 

  _____  

De: MYMTEC S.A. - Javier Wamba [mailto:[EMAIL PROTECTED] 
Enviado el: Jueves, 15 de Febrero de 2007 12:14 p.m.
CC: Lista .net
Asunto: [puntonet] colecciones estaticas

 

* Replies will be sent through Spamex to [email protected] 
* For additional info click ->  <http://www.spamex.com/i/?v=13137989>
www.spamex.com/i/?v=13137989 

 

En base a lo que me sugirio Leonardo para evitar la concurrencia en una
grabacion de registros de stock hice una prueba que mas abajo adjunto. El
tema es que me surgio una duda con respecto a los metodos y propiedades
estaticas. 

Lo probe en una aplicacion asp.net, utilize un pattern singleton, pido la
instancia de dos hilos distintos y me fijo si no hay concurrencia. El tema
es que al cerrar la aplicacion en una maquina y dejarla abierta en otra la
coleccion que voy cargando con las llamadas queda viva. Mi pregunta es,
¿Cual es el ciclo de vida de una coleccion que esta declarada como estatica
en una clase?.

 

Muchas gracias

 

Javier

 

****************************************************************************
****************************************************************************
****************************

Partial Class _Default

Inherits System.Web.UI.Page

Protected Sub form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles form1.Load

End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim ss As New Class1

ss.correrHilos(Me.TextBox2.Text)

Me.TextBox1.Text = ""

For Each cad As String In mymtec.pattern.Singleton.coleccion

Me.TextBox1.Text = Me.TextBox1.Text & vbCrLf & cad & " "

Next

End Sub

End Class

 

****************************************************************************
****************************************************************************
****************************

Public Class Class1

Public Sub correrHilos(ByVal dondeEstoy As String)

Dim sdd As mymtec.pattern.Singleton = mymtec.pattern.Singleton.GetInstance

Dim tr As New System.Threading.Thread(New Threading.ThreadStart(AddressOf
sdd.grabar))

tr.Name = dondeEstoy & " ** " & "proceso1"

tr.Start()

Dim ss As New System.Threading.Thread(New
System.Threading.ThreadStart(AddressOf sdd.grabar))

ss.Name = dondeEstoy & " ** " & "proceso2"

ss.Start()

While tr.ThreadState <> Threading.ThreadState.Stopped Or ss.ThreadState <>
Threading.ThreadState.Stopped

Dim tito As String = "hola"

End While

End Sub

End Class

****************************************************************************
****************************************************************************
*************************************************************************

Imports System.Threading

Namespace mymtec.pattern

Public Class Singleton

Public Shared coleccion As New Collection

Private Shared _singleton As Singleton

Private Shared _mu As New Mutex()

Private Sub New()

End Sub

Public Shared Function GetInstance() As Singleton

_mu.WaitOne()

Try

If _singleton Is Nothing Then

_singleton = New Singleton()

End If

Finally

_mu.ReleaseMutex()

End Try

Return _singleton

End Function

Public Sub grabar()

_mu.WaitOne()

coleccion.Add(System.Threading.Thread.CurrentThread.Name & " - 1")

Threading.Thread.Sleep(1000)

coleccion.Add(System.Threading.Thread.CurrentThread.Name & " - 2")

_mu.ReleaseMutex()

End Sub

End Class

End Namespace

 

 

Responder a