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 Thrown
aanvinkt voor Common Language Runtime Exception
in 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.
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.Timer
in plaats van System.Threading.Timer
voor 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.