Leonardo:
Lo que me explicas tambien me sirve, pero en mis pruebas la coleccion estatica 
iba mas para guardar lo que iba haciendo no para usarlo, quedate tranquilo no 
iba a usar una coleccion estatica. Solo me surgio la duda al ver que la 
coleccion que hice vivia mientras cerraba y abria los explorer en distintas 
maquinas, mi duda basicamente era saber cuando se descargaba de memoria una 
variable estatica como es el caso de la variable singleton en tu ejemplo.

Te agradezco mucho.

Saludos

Javier


----- Original Message ----- 
  From: [EMAIL PROTECTED] 
  To: [email protected] 
  Sent: Thursday, February 15, 2007 3:59 PM
  Subject: [puntonet] colecciones estaticas


  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 -> 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