Visual Basic.NET - System.void

 
Vista:
sin imagen de perfil
Val: 344
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Miguel (281 intervenciones) el 14/01/2020 17:58:06
Alguien puede decirme la causa de que el Syste.void en Visual Studio 2019 este constantemente dando problemas.
Yo hasta hace cuatro meses con el 2017 no tenía ningún problema ya ahora se pierden los Datasource constantemente. en los formularios. Ademas curiosamente hay veces que entro para hacer pruebas y no pasa nada pero la siguiente vez que entro ya me da error.

Si hay forma de evitar este error puede alguien indicarme como hacerlo.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Phil Rob (1554 intervenciones) el 15/01/2020 15:58:53
Hola Miguel,

Penso que Wilfredo te da la solucion el 3/10/2019 :
"En VS 2019, cuando tienes un bindingsource o algún componente enlazado a datos y cierras el proyecto con el formulario abierto(el código), en la propiedad bindingsourcce, se pone esa bendita palabra System.Void, en la propiedad datasource, así que revisa algún combobox. o datagridview en la propiedad datasource y quita esa palabra y todo irá bien."

No es bien este solucion ?

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 344
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Miguel (281 intervenciones) el 15/01/2020 19:46:47
Hola Phil.
En corregirlo no tengo problemas, cuando salgo lo primero que hago es guardar todo, después siempre cierro la solución y por ultimo me salgo. El problema es que algunas veces cuando entro en el proyecto me salta el error automáticamente. Así que lo de cerrar no entiendo pues cerra todos los formularios no tendía sentido. Nunca me había pasado este problema y ahora todos los días me surge durante las 7 o 8 horas que estoy trabajando a lo mejor 30 veces o más.
Con Wilfredo ya he hablado de este tema pero yo no acabo de dar con el fallo o de verlo, pero que últimamente me pase todos los días desde hace unos siete meses cuando antes nunca me había pasado se me hace incompresible. De todas formas a partir de ahora cerrare todos los formularios ya que todos los tengo con uno o más bindingSource.

Gracias por tu ayuda.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Phil Rob (1554 intervenciones) el 16/01/2020 11:48:11
Hola Miguel,

Quizá puedes testar la liberación de la memoria para cada binding iniciado : BindingSource1.Dispose().

Este es verdad para todo objeto iniciado con New, el mejor es de lo destruir al momento dónde no es más necesario.
A menudo, olvidamos esta operación, este puede hacer problema.
Por ejemplo, encontramos mucho casos dónde iniciamos una operación de DB con New en un procedimiento que es llamado mucho veces y que no contiene el comando Dispose : en este procedimiento, cada New hace la iniciación de un nuevo objeto y estos objetos se apilan en la memoria. Si este se dura mucho, vienen los problemas.
Este es mismo para cada Form (y también para los archivos) pero cuando ejecutamos Close, el sistema hace la liberación de la memoria.

Espero que estos comentarios te ayudaran ...

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 344
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Miguel (281 intervenciones) el 16/01/2020 15:16:41
Los cierres de formulario los tengo con Close pero voy a utilizar el Dispose que hace tiempo si lo utilizaba para cerrar el formulario.
Ya te comentare si veo algún cambio en la situación, no obstante ayer al dejar de trabajar fui cerrando los Form de los que había utilizado así que por la tarde cuando entre veré si ha sido suficiente esta medida.

La experiencia de programar en nCapas con estos pequeños inconvenientes que surgen me está mareando.

Muchas gracias Phil y un saludo.

Miguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Phil Rob (1554 intervenciones) el 16/01/2020 15:59:30
Pensó que para un Form, el método Close es suficiente, pero también utilizar Dispose.
Tiene que utilizar Dispose para todos objetos abierto con New.

Este es importante de no iniciar mucho veces un objeto sin lo destruir entre cada vez.
Este no concierne solamente los Form, miras todo tu código.

Buen trabajo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 344
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Miguel (281 intervenciones) el 17/01/2020 11:46:03
Buenos días Phil.

Pero el Dispose según he leído se debe utilizar para "recursos no administrados", que desde luego no tengo ni idea en que consiste. De todas formas voy a utilizar el Dispose tal como me indicas y ya te comentare si he revertido el problema pues la verdad es que me tiene un tanto aburrido porque me hace perder mucho tiempo para corregir los "System.void" que se producen.

Muchas gracias y un saludo

Miguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 344
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Miguel (281 intervenciones) el 17/01/2020 13:36:47
Phil quería pregunarte que diferencia hay entre estas dos formas de salir.

La primera : En esta hay que incluir : Implements IDisposable

1
2
3
4
5
6
7
8
9
10
11
12
Private Sub btnSalir_Click(sender As Object, e As EventArgs) Handles btnSalir.Click
    Try
        MsgBox("Conexión cancelada", CType(MsgBoxStyle.Information + MsgBoxStyle.OkOnly, MsgBoxStyle), "Conexión de datos")
    Finally
        Dispose()
    End Try
End Sub
 
Public Overloads Sub Dispose() Implements IDisposable.Dispose
    Dispose(True)
    GC.SuppressFinalize(Me)
End Sub

La segunda

1
2
3
4
5
6
7
8
9
10
Private Sub BtnSalir_Click(sender As Object, e As EventArgs) Handles BtnSalir.Click
    Finalize()
    MsgBox("Conexión cancelada", CType(MsgBoxStyle.Information + MsgBoxStyle.OkOnly, MsgBoxStyle), "Conexión de datos")
    Close()
    End
End Sub
 
Protected Overrides Sub Finalize()
    MyBase.Finalize()
End Sub

Gracias y un saludo

Miguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Phil Rob (1554 intervenciones) el 17/01/2020 16:16:33
Hola Miguel,

Para todos los objetos "ordinarios" que utilizas, no utilizar IDisposable, no re-escribir el metodo Dispose, nunca utilizar Finalize.

Por ejemplo, con el codigo para leer una tabla en una DB :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
' En este procedimiento, existen 2 métodos NEW. Este es la razon porque existen tambien 2 métodos DISPOSE.
' En este caso, ninguno residuo en la memoria.
 
Dim FraseSql As String = "SELECT * FROM UnaTabla"
 
Dim MiCon As New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0;Data Source=D:\Tmp\MiDB.mdb")
Dim MiAdapter As New OleDbDataAdapter(FraseSql, MiCon)
 
Dim MiDt As New DataTable("MiDataTabla")
 
MiAdapter.Fill(MiDt)
 
' Aqui, tengo los datos en la datatabla MiDt.
' No he mas nécesario de la conexion y del adapter
MiAdapter.Dispose()  ' Adapter no tiene el método Close
MiCon.Close()   ' Connection tiene el método Close
MiCon.Dispose()   ' Pero puedo tambien utilizar su método Dispose
 
' Aqui, tengo los datos en  MiDt ... ... ...

Si un objeto tengo la método Close, este bien de la utilizar y este bien de utilizar en mas, la método Dispose si existe.

Existen objetos que no tienen métodos Close, ni Dispose. También es bien de afectar Nothing a la referencia cuando el objeto no es más necesario. Por ejemplo, en enviado de correo, el objeto smtp no tiene Close ni Dispose :
1
2
3
4
smtp = New SmtpClient(CBServidor.Text) ' Seleccion del Servidor SMTP  (Choix du serveur smtp)
' ... ... ...
' Cuando no necesario este smtp :
smtp = Nothing   ' El "Garbage Collector" hacá el resto

Veces, un objeto contiene muchos objetos segundarios. Por ejemplo, en enviado de correo, el objeto Mail tiene objetos segundarios MailAddress y Attachment :
1
2
3
4
5
6
Mail.From = New MailAddress(Expedidor) ' Seleccion de un expedidor  (Sélection de 1 expéditeur)
Mail.To.Add(New MailAddress(Destinatario)) ' Seleccion de un destinatario (Sélection de 1 destinataire)
' ... ... ...
    Dim Attache As New Attachment(S)
    Mail.Attachments.Add(Attache)
' ... ... ...
En este caso, pensamos que este es suficiente de destruir el objeto primario y que el "Garbage Collector" hará el resto :
1
Mail.Dipose()

Estos metodos son necesarios para los objetos administrados. Si no administrados, no tienen método Dispose.

La programación de Dispose, Finalize, con IDisposable no, este es para los objetos que TU escribes, no para los objetos que ya existen en VisualStudio y que haces instancias.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 344
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Miguel (281 intervenciones) el 18/01/2020 14:43:55
Gracias Phil por esta información pero ahora estoy más perdido que antes. La conexión con la B.D. yo la hago de esta forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Imports System.Configuration
 
Public Class Conexion
    Private Shared _connectionString As String
 
    Public Shared ReadOnly Property ConnectionString As String
        Get
            If _connectionString Is Nothing Then
                _connectionString = ConfigurationManager.ConnectionStrings("Calderas").ConnectionString
            End If
            Return Conexion._connectionString
        End Get
    End Propertyhttps://www.lawebdelprogramador.com/img/img.png?11.22
End Class

Entonces puedes aclarar que utilizo para el cierre. La verdad es que cuando he leído sobre como cerra la conexión no he visto tanta información sobre el tema pero en la forma de programar con nCapas tampoco utilizo la programación que aquí me indicas.
Si quieres te puedo pasar el fuente de lo que estoy haciendo pues es con lo que estoy perfeccionando lo que he aprendido.

Un saludo y muchas gracias.

Miguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Phil Rob (1554 intervenciones) el 18/01/2020 15:53:44
Hola Miguel,

Mi ejemplo con la DB estaba solamente un ejemplo, sin ninguna ligadura con tu programa.
Como mis ejemplos con Smtp y Mail, estos estaban solamente ejemplos casi didácticos.

En el código que envías, no veo NEW. Entonces, este es normal que no veo DISPOSE.

Si quieres revisar todo el código para eliminar estas fuentes de problemas, propongo que hace un Buscar (CTRL + F) en toda la solución de la palabra NEW. Cada vez que lo veas, verificar si no es útil de destruir el objeto con DISPOSE en el mismo procedimiento. A vez, no puede destruir el objeto, el objeto debe ser destruido si DIM es escribido en el mismo procedimiento :
1
2
3
4
5
6
7
Private Sub UnProc()
   Dim UnObjeto As UnTipoObjeto
   UnObjeto = New UnTipoObjeto
‘ … los códigos del procedimiento
‘ Antes borrar :
   UnObjet.Dispose()
En  Sub

Puedes verificar de misma maniera si no existe SHOW, LOAD, OPEN, …, que pueden ser cerrar en mismo procedimiento con CLOSE o DISPOSE. Atención, con Form, HIDE no es igual a CLOSE. Con Form, CLOSE es bien.

Atención, estas operaciones están para eliminar la fuente del problema System.Void (que hace pensar a una referencia olvidada), pero quizá no esta es el problema.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 344
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

System.void

Publicado por Miguel (281 intervenciones) el 18/01/2020 17:33:35
Estas cuatro lineas que me pones de ejemplo me dan una idea de lo que tengo que verificar y aplicar. Voy a examinar el código con detenimiento para ver lo que corresponde y luego probare a ver si así me quito esta tortura de encima.

Muchas gracias Phil

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar