web-dev-qa-db-fra.com

C #: "Une exception de première chance du type 'System.InvalidOperationException'"

Travaillant sur une affectation de classe en C #, je suis tombé sur un blocage du programme sans erreur (sauf ce qui est écrit dans la fenêtre de débogage de VS2010). Voici le code typique provoquant le crash:

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 que j'oublie ici?

** ÉDITER **

Il n'y a pas d'erreur, le programme se termine simplement comme si j'appelais 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).
57
Yanick Rochon

Si vous vérifiez Thrown pour Common Language Runtime Exception dans la pause lorsqu’une fenêtre d’exception (Ctrl+Alt+E dans Visual Studio), l'exécution doit alors ê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

152
Mark Avenius

Le problème ici est que votre minuteur démarre un thread et lorsqu'il exécute la fonction de rappel, la fonction de rappel (updatelistview) accède aux contrôles sur le thread de l'interface utilisateur, ce qui ne peut pas être fait car this

11
user415789

Pensez à utiliser System.Windows.Forms.Timer au lieu de System.Threading.Timer pour une application graphique, pour les minuteries basées sur la file d'attente de messages Windows au lieu de threads dédiés ou du pool de threads.

Dans votre scénario, aux fins des mises à jour périodiques de l'interface utilisateur, cela semble particulièrement approprié, car vous n'avez pas vraiment de travail de fond ou de calcul long à effectuer. Vous voulez juste faire de petites tâches périodiques qui doivent se produire sur le thread d'interface utilisateur de toute façon.

0
Ran