2010-12-08 4 views
55

En travaillant sur une affectation de classe en C#, j'ai rencontré un crash de programme sans erreur (sauf ce qui est écrit dans la fenêtre de débogage de VS2010). Voici le code typique causant l'accident:C#: "Une exception de première occurrence de type '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'est-ce qui me manque ici?

** EDIT **

Il n'y a pas d'erreur, le programme se termine juste comme si je qualifierais 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

trace de pile? ligne de code lorsque l'exception jette? –

Répondre

150

Si vous cochez Thrown pour Common Language Runtime Exception dans la pause lorsqu'une exception fenêtre (Ctrl + Alt + E dans Visual Studio), l'exécution doit être interrompue pendant le débogage lorsque l'exception est levée.

Cela vous donnera probablement un aperçu de ce qui se passe.

Example of the exceptions window

+1

non! même avec cette option aucune exception n'a été levée et l'application est sortie sans interruption dans l'EDI –

+3

oui! J'ai vérifié tous "Thrown" et j'ai eu l'erreur qui se passe où j'ajoute le nouvel élément (j'ai un peu rétréci cela déjà) et j'ai obtenu cette réponse: "Opération croisée pas valide: Contrôle 'listView1' accédé depuis un thread autre que le thread il a été créé le. " ... merci pour le raccourci. –

+1

@ Mark Avenius - Cela m'a aidé à trier mon problème aussi - jamais réalisé cette option existait. Très utile. – Vidar

11

Le problème ici est que votre minuterie démarre un thread et quand il exécute la fonction de rappel, la fonction de rappel (de rafraichirListe) accède à des contrôles sur thread d'interface utilisateur donc ce ne peut pas être fait becuase de this

0

Vous pouvez utiliser System.Windows.Forms.Timer au lieu de System.Threading.Timer pour une application GUI, pour les temporisateurs basés sur la file d'attente des messages Windows au lieu des threads dédiés ou du pool de threads. Dans votre scénario, dans le cadre de mises à jour périodiques de l'interface utilisateur, il semble particulièrement approprié car vous n'avez pas vraiment de travail en arrière-plan ou de calcul long à effectuer. Vous voulez juste faire de petites tâches périodiques qui doivent se produire sur le thread de l'interface utilisateur de toute façon.

Questions connexes