2010-12-08 18 views
55

Trabajando en una asignación de clase en C#, me encontré con un bloqueo del programa sin ningún error (excepto lo que está escrito en la ventana de depuración de VS2010). Aquí está el código típico que causa el bloqueo:C#: "Una primera excepción de tipo 'System.InvalidOperationException'"

public partial class Test : Form 
{ 
    public Test() 
    { 
     InitializeComponent(); 
    } 

    private void Test_Load(object sender, EventArgs e) 
    { 
     ColumnHeader header; 

     header = new ColumnHeader(); 
     header.Text = "#"; 
     header.TextAlign = HorizontalAlignment.Center; 
     header.Width = 30; 
     listView1.Columns.Add(header); 

     TimerCallback tcb = this.UpdateListView; 

     System.Threading.Timer updateTimer = new System.Threading.Timer(tcb, null, 0, 1000); 
    } 

    public void UpdateListView(object obj) 
    { 
     ListViewItem item; 
     listView1.Items.Clear(); 

     for (int i = 0; i < 10; i++) 
     { 
      item = new ListViewItem(i.ToString()); 

      listView1.Items.Add(item); 
     } 

    } 
} 

... ¿Qué me falta aquí?

** ** EDITAR

No hay error, el programa simplemente termina como si yo llamaría System.Environment.Exit(0);

A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll 
The program '[4644] ProgramTest.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0). 
The program '[4644] ProgramTest.vshost.exe: Program Trace' has exited with code 0 (0x0). 
+4

stack trace? línea de código cuando lanza la excepción? –

Respuesta

150

Si marca Thrown para Common Language Runtime Exception en el descanso cuando una excepción ventana (Ctrl + Alt + E en Visual Studio), la ejecución debería interrumpirse mientras se depura cuando se lanza la excepción.

Esto probablemente le dará una idea de lo que está sucediendo.

Example of the exceptions window

+1

no! incluso con esa opción, no se lanzaron excepciones y la aplicación salió sin interrupción en IDE –

+3

¡sí! Verifiqué todo "Lanzado" y obtuve el error cuando agregué el nuevo elemento (ya lo reduje un poco) y obtuve esta respuesta: "Operación entre hilos no válida: Control 'listaView1' accedido desde un hilo que no sea el hilo fue creado en ". ... gracias por el atajo. –

+1

@Mark Avenius - Eso me ayudó a resolver mi problema también - nunca se dio cuenta de que existía esa opción. Muy útil. – Vidar

11

El problema aquí es que el temporizador se inicia un hilo y cuando se ejecuta la función de devolución de llamada, la función de devolución de llamada (updatelistview) está accediendo a los controles sobre el hilo de interfaz de usuario para que esto no se puede hacer becuase de this

0

Considere utilizar System.Windows.Forms.Timer en lugar de System.Threading.Timer para una aplicación GUI, para temporizadores que se basan en la cola de mensajes de Windows en lugar de en subprocesos dedicados o en el grupo de subprocesos.

En su escenario, con el propósito de actualizaciones periódicas de la interfaz de usuario, parece particularmente apropiado ya que realmente no tiene un trabajo en segundo plano o un cálculo largo para realizar. Simplemente desea realizar pequeñas tareas periódicas que de todos modos tienen que suceder en el hilo de UI.

Cuestiones relacionadas