C#:“类型'System.InvalidOperationException'的第一次机会异常”

时间:2010-12-08 22:38:28

标签: c# crash

在C#中处理类赋值时,我遇到了一个没有任何错误的程序崩溃(除了在VS2010的调试窗口中写的内容)。以下是导致崩溃的典型代码:

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).

3 个答案:

答案 0 :(得分:152)

如果在异常窗口中检查Thrown Common Language Runtime Exception中的{{1}}( Ctrl + Alt + E 在Visual Studio中),然后在抛出异常时进行调试时执行应该中断。

这可能会让您对正在发生的事情有所了解。

Example of the exceptions window

答案 1 :(得分:11)

这里的问题是你的计时器启动一个线程,当它运行回调函数时,回调函数(updatelistview)正在访问UI线程上的控件,所以这不能做到this

答案 2 :(得分:0)

对于GUI应用程序,考虑使用System.Windows.Forms.Timer而不是System.Threading.Timer,对于基于Windows消息队列而不是专用线程或线程池的计时器。

在您的方案中,为了定期更新UI,似乎特别合适,因为您实际上没有后台工作或长时间执行计算。您只想定期执行必须在UI线程上执行的小任务。