【问题标题】:C# : "A first chance exception of type 'System.InvalidOperationException'"C#:“'System.InvalidOperationException' 类型的第一次机会异常”
【发布时间】:2011-05-22 12:59:37
【问题描述】:

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

【问题讨论】:

  • 堆栈跟踪?抛出异常时的代码行?

标签: c# crash


【解决方案1】:

如果在异常窗口 (Ctrl+Alt+E in Visual Studio ),那么当您在调试时抛出异常时,执行应该会中断。

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

【讨论】:

  • 不!即使使用该选项,也不会引发异常并且应用程序在 IDE 中没有中断而退出
  • 是的!我检查了所有“抛出”,并且在添加新项目的地方发生了错误(我已经缩小了范围)并得到了这个答案:“跨线程操作无效:控制'listView1'从线程以外的线程访问它是在上面创建的。” ...感谢您的快捷方式。
  • @Mark Avenius - 这也帮助我解决了我的问题 - 从未意识到存在该选项。非常方便。
  • 一个非常方便的工具!谢谢!
  • @user3290180 默认情况下?如果它总是设置,调试器会在每个异常上中断,包括用户已经处理的异常(通过 try/catch 块)。通常,我希望取消设置此设置;只有在某些情况下,我才关心确切了解每个异常何时抛出。
【解决方案2】:

这里的问题是你的计时器启动了一个线程,当它运行回调函数时,回调函数 (updatelistview) 正在访问 UI 线程上的控件,因此由于this 而无法做到这一点

【讨论】:

    【解决方案3】:

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

    在您的场景中,出于定期更新 UI 的目的,这似乎特别合适,因为您实际上并没有后台工作或长时间计算要执行。你只是想做周期性的小任务,无论如何都必须在 UI 线程上发生。

    【讨论】:

      猜你喜欢
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多