Los foros del Guille

Ya está a la venta Novedades de Visual Basic 9.0

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 
Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu interés (algunos de los avisos publicados)

20/mar/2008

¡Ya puedes comprar mi libro de Visual Basic 9.0!


http://www.elguille.info/NET/NovedadesVB9/

  Foro: .NET VB Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 57277 - Pregunta sobre webservices y multihilos
IDAsuntoFechaNick 
57277 Pregunta sobre webservices y multihilos24/10/13 09:40Manuel_74   
Buenos días, soy casi nuevo en esto de .Net y me he topado con un problema. En mi empresa me pidieron que realizara un servicio web donde dar disponibilidad de precios a los clientes para determinados establecimientos, bien, me puse manos a la obra, lo que ocurre es que se generaba tal cuello de botella en el servidor de BD (Sql Server Enterprise 2008 R2) que se quedaba tiritando y claro, los clientes me comían.
Bien, seguí estudiando el problema y vi el uso de hilos que podrían solucionar mi problema. El resultado de una consulta genera una tabla en Sql server tal que así.

HOTEL FECHA HABIT SERVICIO PRECIO
1 25/10/2013 DB AD 49,6
1 26/10/2013 DB AD 49,6
1 27/10/2013 DB AD 49,6
1 25/10/2013 DB AL 35,2
1 26/10/2013 DB AL 35,2
1 27/10/2013 DB AL 35,2
2 25/10/2013 DB MP 74,24
2 26/10/2013 DB MP 74,24
2 27/10/2013 DB MP 74,24
2 25/10/2013 DB PC 98,88
2 26/10/2013 DB PC 98,88
2 27/10/2013 DB PC 98,88

Lo que pretendo realizar es que, por cada hotel crear un array de hilos que a su vez se divida en otros hilos por habitación y este a su vez por servicio y así dividir el problema.
Sabrían ustedes donde poder encontrar un ejemplo parecido o explicarme un poco como funciona esto de los hilos que no sea por consola??

Como puedo hacer para enviarles un .rar con un proyecto realizado en consola.

Gracias, espero puedan ayudarme.
IDAsuntoFechaNick 
57279 Re: Pregunta sobre webservices y multihilos (Resp: 57277)24/10/13 15:10Pipe[hgjfkdls]   
Manuel,

Entiendo tu problema, lo que pongo en duda es la frase final, "que no sea por consola?" jejejejeje, es que me parece que el problema lo tenes solucionado pero no puedes pasar de la consola a controles windows...

De todas formas, efectivamente la forma de realizarlo es mediante threads, lo único en lo cual debes ser cuidadoso es que los métodos se crucen, vale decir, que puedan entrar dos hilos al mismo tiempo tanto en la lectura como en la escritura de datos (eso te dará errores en tiempo de ejecución). en verdad el funcionamiento de threads es muy simple, no creo que tengas problemas con ellos, en la red hay bastante documentación. Te dejo un buen ejemplo de webservices y multi-threads:

http://blogs.msdn.com/b/nikhiln/archive/2008/04/12/multi-threaded-web-service-calls-a-c-code-sample.aspx

Ahora bien, si tienes problemas a la hora de "salir" de la consola, se debe a que los controles de windows se saturan con las operaciones de hilos ya que no das tiempo para actualizarse, re dibujarse y demás. esto se resuelve mediante la incorporación de delegados que modifiquen tus controles pertenecientes al menester principal. Cualquier duda en esto te recomiendo que entres a la sección de C# y veas mi post llamadas asíncronas y controles de formularios.

Si tenes más dudas solo escríbenos.

Saludos,

[hgjfkdls]
[Editado: Pipe, 24/10/2013 15:11:06]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57281 Re: Pregunta sobre webservices y multihilos (Resp: 57279)25/10/13 07:26Manuel_74   
Hola Pipe, muchisimas gracias por su pronta respuesta.
Mire, cuando me refiero a consola me refiero a que es una aplicación basada en consola (Los programas creados para correr bajo DOS).
Si me deja un correo electronico le envio un pequeño proyecto donde se ve más o menos lo que pretendo hacer.
Tendría ese ejemplo en VB.net, es que con C# como que no lo entiendo demasiado, ademas como le he comentado soy un poco nuevo en esto y no se interpretar el código y no se como crear ese proyecto.
He visto en el código que no hay ningun [WebMethod].

Mire esto es lo que pretendo en mi webservices:

Tengo esta clase:
Clase de disponibilidad:
Imports System.Xml.Serialization

'Peticion ++++++++++++++++++++++++++++++++++++++++++
_
Public Class Peticion_Disponibilidad
Public usuario As String
Public passw As String
Public Hotel As String
Public FechaEntrada As Date
Public FechaSalida As Date
Public Poblacion As String
Public Provincia As Integer
Public ListHab() As Habitaciones
End Class

_
Public Class Habitaciones
Public TipoHabitacion As String
Public Regimen As String
End Class




'Respuesta ++++++++++++++++++++++++++++++++++++++++++
_
Public Class Respuesta_Disponibilidad
_
Public D_IdSolicitud As String
Public D_Hoteles As List(Of D_Hotel)
Public D_CodigoError As String
Public D_TiempoRespuesta As Double
End Class
_
Public Class D_Hotel
_
Public D_CodigoHotel As Integer
_
Public D_DescripcionHotel As String
_
Public D_IvaAplicado As Double
_
Public D_CodigoError As String
_
Public D_Fecha_Cierre As Date
_
Public D_Fecha_Apertura As Date
Public D_ListaHabitaciones As List(Of D_Habitacion)
End Class
_
Public Class D_Habitacion
_
Public D_NumeroHabitacion As Integer
_
Public D_TipoHabitacion As String
_
Public D_DescripcionHabitacion As String
End Class

Este sería el método que utilizo.
_
Public Function Disponibilidad(ByVal Request As Peticion_Disponibilidad) As Respuesta_Disponibilidad


Return NodoHoteles
End Function

Dentro de la Funcion Disponibilidad pretendo lo que comente, ahora bien no sé el como realizarlo ya que el método devuelve la clase serializada en Xml, como puedo hacer una llamada a un array de hilos y el resultado recogerlo en la funciona para así devolver al cliente esa clase serializada.



Millones de gracias desde ya.
Saludos.

[Editado: Manuel_74, 25/10/2013 07:27:20]
[Manuel_74, 25/10/2013 07:27:56]
[Manuel_74, 25/10/2013 07:40:42]
[Manuel_74, 25/10/2013 07:45:20]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57282 Re: Pregunta sobre webservices y multihilos (Resp: 57281)25/10/13 09:03Manuel_74   
Hola de nuevo, creo este nuevo hilo porque he encontrado algo parecido a lo que quiero, miren este código.

Imports System.Web.Services
Imports System.Web.Services.Protocols    
Imports System.ComponentModel

' To allow this Web Service to be called from script,
     using ASP.NET AJAX, uncomment the following line.
' <System.Web.script.Services.scriptService()> _
<System.Web.Services.WebService()> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class DemoService
    Inherits System.Web.Services.WebService

       <WebMethod()> _
    Public Function
         XMLReceiver(ByVal XMLData As String) As Integer
        Dim retval As Integer = Validate(XMLData)
        Dim thrd As
             New Threading.Thread(AddressOf Process)
        thrd.Start()
        Return retval
    End Function

    Public Function
         Validate(ByVal XMLData As String) As Integer
        Return 0
    End Function

    Public Sub Process()
        'get time
        Dim start As Date = Date.Now
        'do work
        Threading.Thread.Sleep(1000 * 10)
        'notification (actually write to DB)
        Dim writer As New IO.StreamWriter("C:\done.txt")
        writer.WriteLine("From " & start.ToLongTimeString &
             " To " & Date.Now.ToLongTimeString & "
             done!")
        writer.Close()
    End Sub
End Class

como podemos observar, directamente le da al cliente un Xml --> 0 y a los 10 segundos graba un ficherito con la hora de comienzo y fin.
Bien, pues yo pretendo hacer algo parecido, pero con el inconveniente que debo de crear 1 hilo por cada establecimiento que me pidan, o sea, si me piden los establecimiento (1,2,3), entonces sera un array de 3 hilos que a su vez se descompondrán en otro array de hilos de habitaciones (DB,ID,SP) y así sucesivamente, pero el kit de la cuestión es como esperar a que todos los hilos terminen y que te devuelva el resultado la función a la que se llama para devolver el Xml. No sé si me he explicado bien..

Gracias por vuestra colaboración, creo que voy a llegar a tener un Sw en condiciones con la ayuda de todos.
Saludos.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57283 Re: Pregunta sobre webservices y multihilos (Resp: 57282)25/10/13 17:01Pipe[hgjfkdls]   
Manuel,

Veamos si logro entender, tu función "Disponibilidad" es la función que se llama mediante el WebService, para esta función te conviene implementar asincronismo,así , los clientes que accedan a ella mediante el servicio web no quedarán pillados mientas trabaja, podes implementar un evento o bien una función CallBack cuando el servicio termine con el trabajo.

Ahora bien, para el multihilo, tenes principalmente 2 opciones:

1.- generar un hilo por cada cliente que llame a tu función del servicio (obviamente esta función podrá llamar a los hilos que desees para recoger la información de respuesta, hoteles, habitaciones, etc...)...cuando estos hilos terminan(obtengas tu respuesta), lanzas un evento o llamas al delegado CallBack para decirle al cliente que la operación ha terminado.

2.- generar múltiples hilos predefinidos y que los clientes consuman estos conforme llamen a tu función.

En lo personal prefiero la primera, creo que el problema del segundo es que no podrán realizar mas peticiones que el número de hilos te definas.

Ya mas concreto, el código que encontraste esta bien...la función recibe un objeto, crea un hilo y llama al proceso que "hace el trabajo", faltaría implementar un evento que le avise al cliente cuando se acabe la tarea o un delegado asíncrono con un método callback.

no soy experto en VB.NET, pero intento ayudar.

Saludos,

[hgjfkdls]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57284 Re: Pregunta sobre webservices y multihilos (Resp: 57283)26/10/13 16:16Manuel_74   
Hola Pipe que tal, muchas gracias por la respuesta, no sé cómo hacer eso que está intentado decirme de implementar asincronismo, se lo que es, pero no sé cómo implementarlo. No obstante sobre los dos puntos que me ha comentado, me he quedado con el primero, mire esto es como lo he implementado, no sé si estará bien, lo he probado y funciona, ahora, no sé si se crean bien los hilos por cada proveedor, no obstante por favor, le rogaría que le echara un vistazo al siguiente código a ver si es así como se hace. (se lo divido en varios mensajes porque veo que no entra en uno solo).
Gracias

Imports System.Xml.Serialization

' ***************************************************************************
' CLASE DISPONIBILIDAD ******************************************************
' ***************************************************************************
'Peticion ++++++++++++++++++++++++++++++++++++++++++
<Serializable()> _
Public Class Peticion_Disponibilidad
    Public Username As String
    Public Password As String
    Public Hotel As String
    Public FechaEntrada As Date
    Public FechaSalida As Date
    Public Poblacion As String
    Public Provincia As Integer
    Public ListHab() As Habitaciones
End Class

<Serializable()> _
Public Class Habitaciones
    Public TipoHabitacion As String
    Public Regimen As String
End Class


'Respuesta ++++++++++++++++++++++++++++++++++++++++++
<Serializable()> _
Public Class Respuesta_Disponibilidad
    <XmlAttribute()> _
    Public D_IdSolicitud As String
    Public D_Hoteles As List(Of D_Hotel)
    Public D_CodigoError As String
    Public D_TiempoRespuesta As Double
End Class


<Serializable()> _
Public Class D_Hotel
    <XmlAttribute()> _
    Public D_CodigoHotel As Integer
    <XmlAttribute()> _
    Public D_DescripcionHotel As String
    <XmlAttribute()> _
    Public D_IvaAplicado As Double
    <XmlAttribute()> _
    Public D_CodigoError As String
    <XmlAttribute()> _
    Public D_Fecha_Cierre As Date
    <XmlAttribute()> _
    Public D_Fecha_Apertura As Date
    Public D_ListaHabitaciones As List(Of D_Habitacion)

End Class

<Serializable()> _
Public Class D_Habitacion
    <XmlAttribute()> _
    Public D_NumeroHabitacion As Integer
    <XmlAttribute()> _
    Public D_TipoHabitacion As String
    <XmlAttribute()> _
    Public D_DescripcionHabitacion As String
End Class


[Editado: Manuel_74, 26/10/2013 16:18:12]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57285 Re: Pregunta sobre webservices y multihilos (Resp: 57284)26/10/13 16:19Manuel_74   
Sigue por aqui.

Bien, una vez definida la clase, este sería el método, también defino una clase llamada principal, para pasar parámetros del request a cada clase hilo.


<WebMethod()> _
Public Function
     Disponibilidad(ByVal Request As Peticion_Disponibilidad) As Respuesta_Disponibilidad

Dim doc_usuario As New XmlDocument
        Dim idusuario As Integer
        Dim Fp As String = ""

Dim NodoHoteles As Respuesta_Disponibilidad
 
    'El usuario se recoge de un xml
    idusuario = doc_usuario.SelectSingleNode("//IDUSUARIO").InnerText
Dim principal As New clase_principal
        principal.Request = Request
        principal.idusuario = idusuario
        principal.Formapago = Fp


        'Distintos hilos por cada usuario
         Select Case idusuario
            Case Is = 1111111
                principal.h_1 = idusuario
            Case Is = 2222222
                principal.h_2 = idusuario
            Case Is = 333333
                principal.h_3 = idusuario
          End Select

Dim dlgt_principal As Thread
        dlgt_principal = New Thread(AddressOf principal.consultar)

        dlgt_principal.Start()

        dlgt_principal.Join()

        Select Case idusuario
            Case Is = 1111111
                NodoHoteles = principal.NodoHoteles_1
            Case Is = 2222222
                NodoHoteles = principal.NodoHoteles_2
            Case Is = 333333
                NodoHoteles = principal.NodoHoteles_3

        End Select

        Return NodoHoteles

    End Function


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57286 Re: Pregunta sobre webservices y multihilos (Resp: 57285)26/10/13 16:20Manuel_74   
sigue:

'***********************************************************************************************
'CLASE PRINCIPAL PARA PASO DE PARAMETROS A LOS DISTINTOS HILOS '***********************************************************************************************

Public Class clase_principal
        Public Request As Peticion_Disponibilidad
        Public idusuario As Integer
        Public Formapago As String
        Public idsolicitud As String
        Public Num_hab As Integer

        Public h_1 As Integer
        Public h_2 As Integer
        Public h_3 As Integer
         
        Public NodoHoteles_1 As Respuesta_Disponibilidad
        Public NodoHoteles_2 As Respuesta_Disponibilidad
        Public NodoHoteles_3 As Respuesta_Disponibilidad
       
Public Sub consultar()
             
            Dim n_hilos As Integer = 0
            Dim ar(n_hilos) As Thread
  
            'comenzamos las llamadas a hilos HIJOS
            'HILO PROVEEDOR 1 ++++++++++++++++++++++++++++++++++
            If h_1 = 1111111 Then

                Dim Ws1 As New Ws_Proveedor_1
                Ws1.Request = Request
                Ws1.idusuario = idusuario
                Ws1.FormaPago = Formapago

                ar(hilos_reales) = New Thread(AddressOf Ws1.Insertar_consulta)
                ar(hilos_reales).IsBackground = True
                ar(hilos_reales).Start()

                ar(hilos_reales).Join()

                NodoHoteles_1  = Ws1.NodoHoteles
                hilos_reales = hilos_reales + 1
                
            End If
        'HILO PROVEEDOR 2 ++++++++++++++++++++++++++++++++++
            If h_2 = 222222 Then

                Dim Ws2 As New Ws_Proveedor_2
                Ws2.Request = Request
                Ws2.idusuario = idusuario
                Ws2.FormaPago = Formapago
                ar(hilos_reales) = New Thread(AddressOf Ws2.Insertar_consulta)
                ar(hilos_reales).IsBackground = True
                ar(hilos_reales).Start()

                ar(hilos_reales).Join()

                NodoHoteles_Europlayas = Ws2.NodoHoteles
                hilos_reales = hilos_reales + 1
                
            End If

  'HILO PROVEEDOR 1 ++++++++++++++++++++++++++++++++++
            If h_1 = 3333333 Then

                Dim Ws3 As New Ws_Proveedor_3
                Ws3.Request = Request
                Ws3.idusuario = idusuario
                Ws3.FormaPago = Formapago

                ar(hilos_reales) = New Thread(AddressOf Ws3.Insertar_consulta)
                ar(hilos_reales).IsBackground = True
                ar(hilos_reales).Start()


                ar(hilos_reales).Join()

                NodoHoteles_Europlayas = Ws3.NodoHoteles
                hilos_reales = hilos_reales + 1
                
            End If


        End Sub

    End Class


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57287 Re: Pregunta sobre webservices y multihilos (Resp: 57286)26/10/13 16:21Manuel_74   
Y por ultimo

ESTA CLASE SE REPETIRA EXACTAMENTE IGUAL PARA CADA CLIENTE, O SEA SE CREARA 1 PARA EL CLIENTE 2 (Ws_2), PARA EL CLIENTE 3 (Ws_3), Y ASÍ SUCESIVAMENTE TANTOS CLIENTE COMO TENGA.

Public Class Ws_1
   Public Request As Peticion_Disponibilidad
   Public idusuario As Integer
   Public FormaPago As String
   Public Res As Integer
   Public NodoHoteles As Respuesta_Disponibilidad


   Sub Insertar_consulta()
   Variables …
   …
   …
   ‘Llamada al procedimiento que monta el Xml.
        Montar_Xml(idusuario, fe, fs, HotelConsulta, TipoHabitacion, NodoHoteles)

End Sub

Private Sub Montar_Xml(ByVal idusuario As Integer,  ByVal fe As Date, ByVal fs As Date, ByVal hotel As        Integer, ByVal tipohab As String , ByRef
     NodoHoteles As Respuesta_Disponibilidad)


       ‘Declaracion de variables….
   …
   …
       Dim idsolicitud as string = “jjjjj”
 
       Dim NodoHoteles_1 As New Respuesta_Disponibilidad

       Dim con_string As
            String =
            System.Configuration.ConfigurationManager.AppSettings("conex1")
       Dim con As New SqlClient.SqlConnection
       con.ConnectionString = con_string
       con.Open()

       Dim Commando As New SqlCommand
       Commando.CommandText = "dbo.SP_Local"
       Commando.CommandType = Data.CommandType.StoredProcedure
       Commando.Connection = con


       Dim Hab As New SqlParameter("@Habitacion", SqlDbType.VarChar)
       Dim Reg As New SqlParameter("@Regimen", SqlDbType.VarChar)
       Dim Hot As New SqlParameter("@Hotel", SqlDbType.Int)
       Dim idusu As
            New SqlParameter("@IdUsuario", SqlDbType.BigInt)
       Dim Fen As New SqlParameter("@entrada", SqlDbType.Date)
       Dim Fsa As New SqlParameter("@Salida", SqlDbType.Date)
       Dim provi As New SqlParameter("@Provincia", SqlDbType.Int)
       Dim pobla As
            New SqlParameter("@Poblacion", SqlDbType.NVarChar)
        …
…

       Commando.Parameters.Add(Hab)
       Commando.Parameters.Add(Reg)
       Commando.Parameters.Add(Hot)
       Commando.Parameters.Add(idusu)
       Commando.Parameters.Add(Fen)
       Commando.Parameters.Add(Fsa)
       Commando.Parameters.Add(provi)
       Commando.Parameters.Add(pobla)
        …
   …
     
       Commando.Parameters("@Habitacion").Value = tipohab
       Commando.Parameters("@Regimen").Value = regimen
       Commando.Parameters("@Hotel").Value = hotel
       Commando.Parameters("@IdUsuario").Value = idusuario
       Commando.Parameters("@Entrada").Value = fe    
       Commando.Parameters("@Salida").Value = fs    
       Commando.Parameters("@Provincia").Value = provincia
       Commando.Parameters("@Poblacion").Value = poblacion
    …
   …

       Try
           Dim Adaptador As New SqlDataAdapter
           Adaptador.SelectCommand = Commando
           Dim Lector As SqlDataReader = Adaptador.SelectCommand.ExecuteReader()

           Dim tabla As New DataTable

[Editado: Manuel_74, 26/10/2013 16:21:37]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57288 Re: Pregunta sobre webservices y multihilos (Resp: 57287)26/10/13 16:22Manuel_74   
tabla.Load(Lector)

            NodoHoteles_1.D_IdSolicitud = idsolicitud

           


            For Each fila As DataRow In tabla.Rows
                Try

                    If AuxHotel <> fila("C4HOTE") Then
                        h = New D_Hotel
                        h.D_ListaHabitaciones = New List(Of D_Habitacion)
                        h.D_CodigoHotel = fila("C4HOTE")
                        h.D_DescripcionHotel = "HOTEL DE PRUEBA"  
                        h.D_IvaAplicado = "10"  
                        h.D_Fecha_Apertura = "1940-01-01"
                        h.D_Fecha_Cierre = "1940-01-01"

                        NodoHoteles_1.D_Hoteles.Add(h)
                        AuxHab = ""
                        ServicioAux = ""

                    End If

                     … 
          …

                Catch ex As Exception

                End Try


            Next

            Lector.Close()
            Adaptador.Dispose()

        Catch ex As Exception

        End Try

        NodoHoteles = NodoHoteles_1

        con.Close()
        SqlConnection.ClearAllPools()


    End Sub


End Class


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57294 Re: Pregunta sobre webservices y multihilos (Resp: 57288)28/10/13 14:26Pipe[hgjfkdls]   
Manuel,

Disculpa la demora, pero el fin de semana lo dedico a mi familia jajajajaja.

Te comento que el método Join() de la clase Thread bloqueara tu sub-proceso hasta que la llamada finalice, por ende, estas llamando al método en otro hilo y esperas a que termine en el mismo proceso por lo cual no tiene mucho sentido.

Otro que me cuesta un poco entender es los casos de usuarios, ¿creas un caso para cada usuario?, eso no me cuadra mucho. deberías listarlos o algo similar, un Dictionary puede ser (para no tener que implementar un key o id único).

Te comento que implementar un método asíncrono en un SW es bien simple te dejo la documentación y el ejemplo de microsoft

http://msdn.microsoft.com/es-es/library/98t3s469(v=vs.90).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

De esta manera se llama al SW asincronamente y cuando termina, ejecuta el método callback con el objeto respuesta, todo esto en un hilo distinto al hilo principal.

Espero te sirva.

Saludos,

[hgjfkdls]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57295 Re: Pregunta sobre webservices y multihilos (Resp: 57294)28/10/13 15:19Manuel_74   
Hola, no se preocupe por la demora y disculpe mi insistencia, pero ando un poco desesperado.
Efectivamente ahora que lo dice, el código es un desastre, la verdad es que no sé cómo hacerlo, lo que pretendo es lo siguiente:
Le pongo un ejemplo para que así se vea un poco mejor:
Imagínese que estos id de usuario realizan peticiones al servicio web.
1000,1001,1000,1002,1000,1001 como se puede apreciar el usuario 1000 hace 3 peticiones al sistema, el 1001 realiza 2 y el 1002 una sola petición.
Bien, en el procedimiento almacenado que debería de devolver los resultados para cada una de las peticiones solicitadas imaginemos que devuelve para la primera petición del usuario 1000 esta tabla:
Hotel fecha habitacion Servicio Precio
100 25/10/2013 DB AD 40
100 26/10/2013 DB AD 40
100 27/10/2013 DB AD 40
200 25/10/2013 DB AD 24
200 26/10/2013 DB AD 24
200 27/10/2013 DB AD 24
300 25/10/2013 DB AD 30
300 26/10/2013 DB AD 30
300 27/10/2013 DB AD 30

Por cada registro pretendo lanzar otro hilo que realice otro cálculo, hasta finalizar la lectura.

En realidad lleva toda la razón, lo de los usuario no tiene mucho sentido y el Join ya sabía que hasta que no termine el hilo no devuelve el valor, pero no sé cómo hacer para detectar cuando un hilo termina devuelva el resultado, por eso puse el join, ahora el código que le voy a mostrar lo realizo con isAlive pero creo que tampoco tiene mucho sentido.
He cambiado mi código, pero me sigue sin gustar, (bufff.. ya estoy hecho un lío no sé por dónde tirar..). Para empezar ya estaría mal los 10 hilos que creo al principio,


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57296 Re: Pregunta sobre webservices y multihilos (Resp: 57295)28/10/13 15:20Manuel_74   
Public NodoHoteles_1 As Respuesta_Disponibilidad

_
Public Function Disponibilidad(ByVal Request As Peticion_Disponibilidad) As Respuesta_Disponibilidad

Dim n_hilos As Integer = 10
Dim ar(n_hilos) As Thread

Dim hilos_reales As Integer = 0


Dim Sw1 As New Ws_1
Sw1.Request = Request
Sw1.idusuario = idusuario
Sw1.FormaPago = Fp

ar(hilos_reales) = New Thread(AddressOf Sw1.Insertar_consulta)
ar(hilos_reales).IsBackground = True
ar(hilos_reales).Start()

While ar(hilos_reales).IsAlive

End While

hilos_reales = hilos_reales + 1

Return NodoHoteles_1
End Function



¿convertir el servicio web a asíncrono es necesario?, porque con los hilos no se solucionaría??
No sé como enfocarlo.
Gracias y de nuevo disculpe las molestias.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57301 Re: Pregunta sobre webservices y multihilos (Resp: 57296)28/10/13 23:09Pipe[hgjfkdls]   
Manuel,

Como lo explico, mmmmmmmm, este es un tema mas de arquitectura que de código, a ver...

Seguramente los usuarios de su aplicación "no entran" a un flujo de datos constante como se hace con sockets o web streams...lo mas seguro, por lo que me dice usted, es que los usuarios hagan "peticiones" mediante webservices unicamente...Teniendo en cuenta esto, recordemos su problema comenzó por que el servidor colapsaba al tener muchas peticiones demorosas, esto implica que que se genera un cuello de botella ya que solo puede procesar de una petición en una. teniendo en cuenta esto, creo que un WS asíncrono sería la mejor solución. Bueno, y esto que hace????...cuando implementamos asincronismo en nuestros métodos, lo que hacemos básicamente es:

En cada llamada del método asíncrono se genera un hilo paralelo el cual "hace el trabajo", una vez termina el método, se llama una función callback (llamada de regreso) la cual nos entrega el objeto deseado... esto tal vez te suena un poco complicado, pero realmente en un WS hará lo siguiente: el cliente llamara a la función asíncrona del webservice, esta se desarrollara en paralelo mientras otros clientes pueden llamar a la misma función (las cuales también se desarrollaran en paralelo) y una vez el WS termine su trabajo le dirá al cliente "Hey amigo, la función ya termino y te entrega el siguiente resultado", fin...

¿Como implementar WS asíncrono?, hay gran documentación en la net. y es relativamente simple.

No te líes mucho, normalmente las soluciones mas simples son las mejores.

[hgjfkdls]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57304 Re: Pregunta sobre webservices y multihilos (Resp: 57301)29/10/13 08:12Manuel_74   
Buenos días Pipe, muchísimas gracias por toda la ayuda ofrecida, me pondré de nuevo a estudiar este último caso.
Una última pregunta si no le importa:
Como pasaría este método a asincronismo:

<WebMethod()> _
    Public Function
         Disponibilidad(ByVal Request As Peticion_Disponibilidad) As Respuesta_Disponibilidad
        Dim doc_usuario As New XmlDocument
        Dim idusuario As Integer
        Dim Fp As String = ""

       
        Dim n_hilos As Integer = 0
        Dim ar(n_hilos) As Thread


        Dim hilos_reales As Integer = 0



        Dim Ws As New Ws_1
        Ws.Request = Request
        Ws.idusuario = idusuario
        Ws.FormaPago = Fp

        ar(hilos_reales) = New Thread(AddressOf Ws.Insertar_consulta)
        ar(hilos_reales).IsBackground = True
        ar(hilos_reales).Start()

        While ar(hilos_reales).IsAlive

        End While

        hilos_reales = hilos_reales + 1



        Return Ws.NodoHoteles



    End Function



Disculpe el tiempo que le he hecho perder.
Mil gracias y saludos.

[Editado: Manuel_74, 29/10/2013 08:20:47]
[Manuel_74, 29/10/2013 08:24:37]
[Manuel_74, 29/10/2013 08:44:49]
[Manuel_74, 29/10/2013 08:47:02]
[Manuel_74, 29/10/2013 08:47:30]
[Manuel_74, 29/10/2013 08:48:05]
[Manuel_74, 29/10/2013 08:48:45]
[Manuel_74, 29/10/2013 08:49:19]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57305 Re: Pregunta sobre webservices y multihilos (Resp: 57304)29/10/13 13:36Pipe[hgjfkdls]   
Manuel,

le dejo esta pequeña colaboración de Jose Luis al Guille, esta muy bien explicado, lo único malo para usted es que esta en C#, pero realmente se entiende muy bien.

Click Me

Como se podrá dar cuenta en el código, su WS tendrá que reestructurarlo levemente, de todas maneras el resultado lo vale.

Luego me cuenta como le ha ido con eso

Saludos,

[hgjfkdls]
[Editado: Pipe, 29/10/2013 13:37:06]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57306 Re: Pregunta sobre webservices y multihilos (Resp: 57305)29/10/13 14:17Manuel_74   
Bueno, creo que ya me voy acercando al kit de la cuestión: lo que ocurre que me da un pequeño error en el EndDisponibilidad justo en la línea "Return ms.dlg.EndInvoke(asyncResult)". Me dice "Referencia a objeto no establecida como instancia del objeto".


Public Delegate Function Delegado_Resultado(ByVal Request As Peticion
    _Disponibilidad) As Respuesta_Disponibilidad


<WebMethod()> _
Public Function
     BeginDisponibilidad(ByVal Request As Peticion_Disponibilidad, ByVal callback As
     AsyncCallback, ByVal asyncState As Object) As IAsyncResult
       
    Dim dlg As New Delegado_Resultado(AddressOf Disponibilidad)
    Dim ms As New Estado()
    ms.dlg = dlg
    ms.EstadoPrevio = asyncState

    Return dlg.BeginInvoke(Request, callback, asyncState)

End Function

<WebMethod()> _
Public Function
     EndDisponibilidad(ByVal asyncResult As IAsyncResult) As
     Respuesta_Disponibilidad

    Dim ms As Estado = CType(asyncResult.AsyncState, Estado)
    Return ms.dlg.EndInvoke(asyncResult)

End Function


Public Function
     Disponibilidad(ByVal Request As Peticion_Disponibilidad) As Respuesta_Disponibilidad

    Dim Ws As New Clase_principal
    Ws.Request = Request
    Ws.idusuario = idusuario
    Ws.FormaPago = Fp

    Ws.Insertar_consulta()

    Return Ws.NodoHoteles

End Function



Public Class Estado
    Public EstadoPrevio As Object
    Public dlg As Delegado_Resultado
End Class

Saludos.
[Editado: Manuel_74, 29/10/2013 14:18:08]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57307 Re: Pregunta sobre webservices y multihilos (Resp: 57306)29/10/13 14:29Pipe[hgjfkdls]   
Manuel,

esto te esta ocurriendo por que estas pasando el objeto asyncState en el metodo begin invoke...

Return dlg.BeginInvoke(Request, callback, asyncState)

debe quedar asi:

Return dlg.BeginInvoke(Request, callback, ms)

Saludos,

[hgjfkdls]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57308 Re: Pregunta sobre webservices y multihilos (Resp: 57307)29/10/13 14:37Manuel_74   
Cierto, efectivamente, acabo de convertir mi Ws en asincrono..
Mil gracias, por no decir millones de gracias..
Pipe, podría hacerle otra pregunta en otro hilo distinto??.. si no es mucha molestia..
Saludos.


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57309 Re: Pregunta sobre webservices y multihilos (Resp: 57308)29/10/13 14:40Pipe[hgjfkdls]   
Manuel,

Claro, pero te comento que VB no es mi lenguaje preferido, por ende, cualquier pregunta, siempre que que pueda ayudar, responderé en C# y tu te darás al trabajo de "pasar" a VB.

Saludos,

[hgjfkdls]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57310 Re: Pregunta sobre webservices y multihilos (Resp: 57309)29/10/13 14:44Manuel_74   
Por supuesto, ningún problema yo lo intento traducir a VB.
Acabo de probar el Sw y se nota que los cores no suben al 100% de consumo y es gracias a usted por supuesto.

Mil gracias.. Ahora la redacto.. También es sobre thread, que es mi calvario..


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57393 Re: Pregunta sobre webservices y multihilos (Resp: 57277)11/12/13 20:30tonyp8   
Hola que tal

Me gustaria saber si alguien sabe como mediante un web service accesar a api de netsuite y traer los datos para actualizar estos mismos , soy nuevo en esto de visual basic .net saludos

tony8


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
57394 Re: Pregunta sobre webservices y multihilos (Resp: 57393)11/12/13 21:06Manuel_74   
Hola tonyp8, siento decirte que no tengo ni la más remota idea de como hacer esto.. yo tambien estoy comenzando a tropezar con estos temas de servicios web.. Pero seguro que aquí hay gente que te ayudara.
I'm sorry..
[Editado: Manuel_74, 11/12/2013 21:06:33]


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.

 
(c) Guillermo 'guille' Som, 2005-2017  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8762)
 
Usuarios activos: 120 - App. iniciada: 20/10/2017 8:43:42 GMT - La hora GMT del servidor es: 21/10/2017 06:44:42 GMT