C# : “Een eerste kans uitzondering van het type ‘System.InvalidOperationException'”

Toen ik aan een klasopdracht in C# werkte, kwam ik een programmacrash tegen zonder enige fout (behalve wat er is geschreven in het foutopsporingsvenster van VS2010). Hier is de typische code die de crash veroorzaakt:

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);
        }
    }
}

… wat mis ik hier?

** BEWERKEN**

Er is geen fout, het programma eindigt gewoonalsof ik 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).

Antwoord 1, autoriteit 100%

Als u Thrownaanvinkt voor Common Language Runtime Exceptionin de pauze wanneer een uitzonderingsvenster (Ctrl+Alt+Ein Visual Studio), dan zou de uitvoering moeten breken terwijl u aan het debuggen bent wanneer de uitzondering wordt gegenereerd.

Dit geeft u waarschijnlijk enig inzicht in wat er aan de hand is.

Voorbeeld van het uitzonderingenvenster


Antwoord 2, autoriteit 7%

Het probleem hier is dat je timer een thread start en wanneer deze de callback-functie uitvoert, heeft de callback-functie (updatelistview) toegang tot besturingselementen op de UI-thread, dus dit kan niet worden gedaan vanwege dit


Antwoord 3

Overweeg het gebruik van System.Windows.Forms.Timerin plaats van System.Threading.Timervoor een GUI-toepassing, voor timers die zijn gebaseerd op de Windows-berichtenwachtrij in plaats van op speciale threads of de threadpool.

In jouw scenario, met het oog op periodieke updates van de gebruikersinterface, lijkt het bijzonder geschikt omdat je niet echt achtergrondwerk of lange berekeningen hoeft uit te voeren. Je wilt gewoon periodieke kleine taken uitvoeren die toch in de UI-thread moeten gebeuren.

Other episodes