Multihilos y transformar metodo asincronico en sincronico Tengo una aplicacion que se comunica con varios dispositivos seriales (utilizando RS485) de forma simultánea.
Necesito preguntarle continuamente el "status" a cada uno de esos dispositivos.
Como puedo llegar a tener hasta 32 dispositivos con los cuales debo hablar, creo un hilo para cada dispositivo donde encapsulo la comunicación de cada uno.
El problema es que el "driver" de los dispositivos, tiene diseñado de forma asincronica el metodo que me retorna el status y yo necesariamente debo tener la
respuesta sincronica.
Para solucionar esto, diseñe un clase intermediaria, que me encapsula la llamada al metodo y la respuesta asincronica.
Class AsynchToSync
Private mTimeout as integer = 5000 ' timeout por defecto
Private mStatus as integer = -1 ' status que me respondio
Private mHasResponse as ManualResetEvent
Public Function getStatus as Integer
mHasResponse = new ManualResetEvent(False)
' llamo al metodo asincronico y espero la devolucion de la llamada.
COMPONENTE.GetStatus(AddressOf GetResponse)
mHasResponse.WaitOne(mTimeout, True)
return mStatus
End Function
Private Sub getResponse(Status as Integer)
Try
mStatus = Status
Finally
' indico que recibi la respuesta
mHasResponse.Set
End try
End Sub
End Class
Y lo llamo desde los diferentes hilos :
Dim c as new AsyncToSync
resultado = getStatus
El problema actual es que cada cierta cantidad de horas de estar corriendo la aplicación, tengo un deadlock congelandome por completo la comunicación con
los dispositivos.
He eliminado todo codigo de Log que tenía (podia ser una de las causas), simplificando el codigo a lo que escribi anteriormente.
Alguien se da cuenta a simple vista del motivo del deadlock ??
Muchas gracias por cualquier comentario (para solucionarlo o de otra arquitectura a utilizar)
Marcelo |