web-dev-qa-db-ja.com

C#:「タイプ 'System.InvalidOperationException'の最初のチャンス例外」

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);
        }

    }
}
_

...ここで何が欠けていますか?

** [〜#〜] edit [〜#〜] **

エラーはありません。プログラムはSystem.Environment.Exit(0);を呼び出す場合のようにendsだけです

_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).
_
57
Yanick Rochon

例外ウィンドウのときにブレークでCommon Language Runtime ExceptionThrownをチェックすると(Ctrl+Alt+E Visual Studioの場合)、例外がスローされるとデバッグ中に実行が中断するはずです。

これにより、何が起こっているのかについての洞察が得られるでしょう。

Example of the exceptions window

152
Mark Avenius

ここでの問題は、タイマーがスレッドを開始し、コールバック関数を実行するときに、コールバック関数(updatelistview)がUIスレッドのコントロールにアクセスしているため、これが this のためにできないことです。

11
user415789

GUIアプリケーションで、専用スレッドまたはスレッドプールではなくWindowsメッセージキューに基づくタイマーの場合、System.Windows.Forms.Timerの代わりにSystem.Threading.Timerを使用することを検討してください。

シナリオでは、UIを定期的に更新するために、バックグラウンドの作業や実行する長い計算がないため、特に適切なようです。とにかくUIスレッドで行わなければならない定期的な小さなタスクを実行したいだけです。

0
Ran