ID | Asunto | Fecha | Nick | |
57277 | Pregunta sobre webservices y multihilos | 24/10/13 09:40 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57279 | Re: Pregunta sobre webservices y multihilos (Resp: 57277) | 24/10/13 15:10 | Pipe[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. |
|
ID | Asunto | Fecha | Nick | |
57281 | Re: Pregunta sobre webservices y multihilos (Resp: 57279) | 25/10/13 07:26 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57282 | Re: Pregunta sobre webservices y multihilos (Resp: 57281) | 25/10/13 09:03 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57283 | Re: Pregunta sobre webservices y multihilos (Resp: 57282) | 25/10/13 17:01 | Pipe[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. |
|
ID | Asunto | Fecha | Nick | |
57284 | Re: Pregunta sobre webservices y multihilos (Resp: 57283) | 26/10/13 16:16 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57285 | Re: Pregunta sobre webservices y multihilos (Resp: 57284) | 26/10/13 16:19 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57286 | Re: Pregunta sobre webservices y multihilos (Resp: 57285) | 26/10/13 16:20 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57287 | Re: Pregunta sobre webservices y multihilos (Resp: 57286) | 26/10/13 16:21 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57288 | Re: Pregunta sobre webservices y multihilos (Resp: 57287) | 26/10/13 16:22 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57294 | Re: Pregunta sobre webservices y multihilos (Resp: 57288) | 28/10/13 14:26 | Pipe[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. |
|
ID | Asunto | Fecha | Nick | |
57295 | Re: Pregunta sobre webservices y multihilos (Resp: 57294) | 28/10/13 15:19 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57296 | Re: Pregunta sobre webservices y multihilos (Resp: 57295) | 28/10/13 15:20 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57301 | Re: Pregunta sobre webservices y multihilos (Resp: 57296) | 28/10/13 23:09 | Pipe[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. |
|
ID | Asunto | Fecha | Nick | |
57304 | Re: Pregunta sobre webservices y multihilos (Resp: 57301) | 29/10/13 08:12 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57305 | Re: Pregunta sobre webservices y multihilos (Resp: 57304) | 29/10/13 13:36 | Pipe[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 MeComo 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. |
|
ID | Asunto | Fecha | Nick | |
57306 | Re: Pregunta sobre webservices y multihilos (Resp: 57305) | 29/10/13 14:17 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57307 | Re: Pregunta sobre webservices y multihilos (Resp: 57306) | 29/10/13 14:29 | Pipe[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. |
|
ID | Asunto | Fecha | Nick | |
57308 | Re: Pregunta sobre webservices y multihilos (Resp: 57307) | 29/10/13 14:37 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57309 | Re: Pregunta sobre webservices y multihilos (Resp: 57308) | 29/10/13 14:40 | Pipe[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. |
|
ID | Asunto | Fecha | Nick | |
57310 | Re: Pregunta sobre webservices y multihilos (Resp: 57309) | 29/10/13 14:44 | Manuel_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. |
|
ID | Asunto | Fecha | Nick | |
57393 | Re: Pregunta sobre webservices y multihilos (Resp: 57277) | 11/12/13 20:30 | tonyp8 | | |
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. |
|
ID | Asunto | Fecha | Nick | |
57394 | Re: Pregunta sobre webservices y multihilos (Resp: 57393) | 11/12/13 21:06 | Manuel_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. |