none
No se controló System.NullReferenceException RRS feed

  • Pregunta

  • Saludos a todos. 

    Soy nuevo acá, así que esta es mi primera interacción en el foro.

    Estoy haciendo una pequeña aplicación en C#, enla que exporto continuamente los datos de un DataGridView a un archivo Excel, entre otras cosas. Cuando ejecuto la aplicación funciona perfecto por unos minutos, a veces pocos, otras veces funciona hasta por media hora. El error que me marca es "Referencia a objeto no establecida como instancia de un objeto" y me apunta a Application.Run(new form1());

    La pila de seguimiento es la siguiente; pero no sé cómo interpretarla. Realmente soy un aficionado.

    No se controló System.NullReferenceException
      HResult=-2147467261
      Message=Referencia a objeto no establecida como instancia de un objeto.
      Source=System.Windows.Forms
      StackTrace:
           en System.Windows.Forms.DataGridViewRowHeaderCell.PaintPrivate(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates dataGridViewElementState, Object formattedValue, String errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts, Boolean computeContentBounds, Boolean computeErrorIconBounds, Boolean paint)
           en System.Windows.Forms.DataGridViewRowHeaderCell.Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, Object value, Object formattedValue, String errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
           en System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
           en System.Windows.Forms.DataGridViewRow.PaintHeader(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow, DataGridViewPaintParts paintParts)
           en System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow)
           en System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, Rectangle clipRect, Boolean singleHorizontalBorderAdded)
           en System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
           en System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
           en System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
           en System.Windows.Forms.Control.WmPaint(Message& m)
           en System.Windows.Forms.Control.WndProc(Message& m)
           en System.Windows.Forms.DataGridView.WndProc(Message& m)
           en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
      InnerException: 

    Estaría muy agradecido si me pueden ayudar a controlar esa excepción. Gracias de antemano. 


    sábado, 28 de marzo de 2015 7:35

Todas las respuestas

  • Por los síntomas que aportas tiene pinta de ser una condición de carrera. ¿Estás programando en multihilo? ¿No será que desde el hilo de background estás accediendo a los objetos que se encuentran bajo el control de la interfaz de usuario?
    sábado, 28 de marzo de 2015 13:17
  • Por los síntomas que aportas tiene pinta de ser una condición de carrera. ¿Estás programando en multihilo? ¿No será que desde el hilo de background estás accediendo a los objetos que se encuentran bajo el control de la interfaz de usuario?
    Sí. Estoy programando en multihilos, de manera que recibo los datos a través del serialPort mediante el evento serialPort.DataReceived, luego, estos datos los paso al dataDridView y posteriormente a Excel en otro hilo, ya que la operación se lleva algo de tiempo y no quiero que el programa se congele unos segundos. Justo ayer (poco después de formular la pregunta) leí que no se pueden modificar las propiedades de los controles de Windows Form desde otro hilo que no sea el principal, más bien, que no es seguro hacerlo. ¿Este será mi error? También proponían algo sobre el método Invoke; me dedicaba a consultarlo ahora. Por lo pronto, probaré a manipular el control desde el hilo principal de ejecución. ¿Alguna recomendación? De nuevo, gracias.
    sábado, 28 de marzo de 2015 18:59
  • Efectivamente, lo más probable es que el problema sea ese. Si manipulas los controles de Windows Forms desde otro hilo, como no están preparados para ello, no ponen los bloqueos necesarios para coordinar las operaciones, y si tienes la mala suerte de que el hilo secundario modifica algún dato del control justo en el momento en que la interfaz estaba también modificándolo, se pueden corromper las estructuras internas, dando lugar a errores del tipo del que estás observando. Son errores intermitentes e impredecibles, y por tanto muy difíciles de depurar.

    Para evitar que se produzcan, cada vez que debas manipular un control debes transportar la ejecución desde el hilo secundario al principal. Esto se hace con los métodos Invoke o BeginInvoke, pasándoles un delegado que apunte al método que ha de manipular la pantalla. Este método pasado al Invoke se ejecuta entonces en el hilo principal (cuando pueda, una vez que el hilo no esté ocupado haciendo otra cosa) y por lo tanto ya no produce errores (pero te bloquea el hilo secundario esperando a que el principal lo atienda, por lo que tienes que elegir juiciosamente cuáles son las partes que hay que ejecutar de esta manera).

    domingo, 29 de marzo de 2015 7:55