C#:“types'System.InvalidOperationException'的第一个机会exception”
在C#中处理类的分配,我遇到了一个没有任何错误的程序崩溃(除了在VS2010的debugging窗口中写的东西外)。 这是导致崩溃的典型代码:
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); } } }
…我在这里错过了什么?
** 编辑 **
没有错误,程序就好像我会调用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).
如果在exception窗口(Visual Studio中的Ctrl + Alt + E)中检查中断的Common Language Runtime Exception
Thrown
,那么在Thrown
Common Language Runtime Exception
时,执行应该在debugging期间中断。
这可能会让你对发生的事情有所了解。
这里的问题是你的计时器启动一个线程,当它运行callback函数时,callback函数(updatelistview)正在访问UI线程上的控件,所以这是不可能的,因为这个
考虑使用System.Windows.Forms.Timer
而不是System.Threading.Timer
作为GUI应用程序,用于基于Windows消息队列而不是专用线程或线程池的计时器。
在你的场景中,为了定期更新UI,看起来特别合适,因为你并没有真正的后台工作或长时间的计算。 你只是想要定期执行一些小任务,而这些任务在UI线程上必须发生。