C#:"System.InvalidOperationException"的第一次机会异常

59

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

4
堆栈跟踪?异常抛出时的代码行? - user415789
3个回答

156

如果你在异常窗口中(在Visual Studio中按下Ctrl+Alt+E),为Common Language Runtime Exception检查Thrown,那么当异常被抛出时,在调试过程中执行应该会停止。

这可能会让你对正在发生的事情有一些了解。

异常窗口示例


1
不行!即使启用了该选项,也没有抛出任何异常,应用程序退出而在 IDE 中没有中断。 - user415789
3
是的! 我检查了所有“Thrown”,我发现错误发生在添加新项目时(我已经缩小了范围),并且得到了这个答案:“无效的跨线程操作:从创建它的线程以外的线程访问控件'listView1'。”…谢谢您提供的捷径。 - Yanick Rochon
1
@Mark Avenius - 那也帮助我解决了排序问题 - 从未意识到该选项的存在。非常方便。 - Vidar
1
非常方便的工具!谢谢! - Cary Bondoc
1
默认情况下?如果它总是被设置,调试器将在每个异常上中断,包括用户已经通过try/catch块处理的异常。通常,我希望取消此设置;只有在某些情况下,我才关心每个异常何时被抛出。 - Mark Avenius
显示剩余5条评论

11
这里的问题在于您的计时器启动了一个线程,当它运行回调函数时,回调函数(updatelistview)正在访问 UI 线程上的控件,因此这是不可能的,因为this

0
考虑在GUI应用程序中使用System.Windows.Forms.Timer而不是System.Threading.Timer,对于基于Windows消息队列而不是专用线程或线程池的定时器。
在您的情况下,为了定期更新UI,似乎特别适合,因为您实际上没有后台工作或长时间计算要执行。您只想定期执行一些必须在UI线程上发生的小任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接