Cita de: **Aincrad** en 28 Diciembre 2018, 02:53 AMCódigo [Seleccionar]'HttpUtility' no está declarado. Puede que esté inaccesible debido a su nivel de protección.
debo importar algo?
Sí, debes añadir una referencia el ensamblado System.Web.dll, e importar el espacio de nombres System.Web.
Si colocas el puntero del ratón sobre el nombre "HttpUtility" en esa linea de código que te da error, Visual Studio te dice el ensamblado que debes referenciar. Al menos en Visual Studio 2013, 2015 y 2017; no recuerdo si en VS 2010 también.
Cita de: **Aincrad** en 28 Diciembre 2018, 02:53 AMse blockea un poco al principio cuando esta obteniendo los datos. me puedes ayudar con eso?
WebClient.DownloadString y WebClient.DownloadFile son métodos sincrónicos, o lo que se conoce como una llamada bloqueante. Debido a que estás llamando a ese método en el thread de la UI, la UI se "bloquea" hasta que el método haya finalizado su ejecución (conectar con el servidor, procesar la query, esperar la respuesta del servidor, etc...) y eso dura un par de segundos... en los que la UI deja de procesar mensajes de ventana.
Para solucionarlo, debes hacer uso de programación asíncrona, y para ello practicamente debes modificar casi todo tu algoritmo. Para empezar, debes usar los métodos asíncronos de la clase WebClient. Puedes recurrir a dos metodologías distintas:
1. Usar los métodos WebClient.DownloadStringAsync() y WebClient.DownloadFileAsync, y suscribirte a los eventos WebClient.DownloadStringCompleted y WebClient.DownloadFileCompleted.
2. Usar las funciones WebClient.DownloadStringTaskAsync() y WebClient.DownloadFileTaskAsync, junto al uso de los operadores Async y Await.
La segunda metodología es más simple/sencilla de aplicar, requiere menos cambios en el código original. Lamentablemente en .NET 4.0 no puedes aplicar dicha metodología, puesto que las funciones mencionadas no están disponibles. Así que estás limitado a tener que recurrir a la primera metodología.
Aquí tienes la documentación oficial del método WebClient.DownloadStringAsync():
Y aquí un ejemplo de código:
PD: el modo de empleo del método WebClient.DownloadFileAsync es practicamente igual que en el ejemplo provisto, solo cambia el nombre del evento al que debes suscribirte, el cual ya mencioné.
Un saludo.
EDITO: bueno, por si al final te resulta dificil el uso de WebClient.DownloadStringAsync(), y cómo alternativa, la opción más sencilla y cutre para resolver el problema con el mínimo de cambios requeridos en tu código actual, sería de la siguiente forma:
Código (vbnet) [Seleccionar]
Private Sub descarga(ByVal url As String)
Dim isCompleted As Boolean
Dim t As New Task(
Sub()
Try
Dim URLDATA As String = cliente.DownloadString(url)
Me.Invoke(Sub()
TextBox2.Text = URLDATA
If TextBox2.Text = "" Then
alert("error", "No response was obtained from the server.")
Else
alert("alert", "Data Obtained, Descripting ...")
End If
End Sub)
Catch ex As Exception
Me.Invoke(Sub() alert("error", ex.Message))
Finally
isCompleted = True
End Try
End Sub)
t.Start()
Do Until isCompleted
Application.DoEvents()
Loop
End Sub
...pero el uso de ese código implica malas prácticas de programación, tenlo en cuenta.