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
