Подтвердить что ты не робот

С#: "Первое исключение исключения типа" System.InvalidOperationException ""

Работая над назначением класса в С#, я столкнулся с сбоем программы без каких-либо ошибок (кроме того, что написано в окне отладки 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);

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

Ответ 1

Если вы проверите Thrown для Common Language Runtime Exception в перерыве, когда окно исключения (Ctrl + Alt + E в Visual Studio), тогда выполнение должно прерываться во время отладки, когда исключение выброшены.

Это, вероятно, даст вам некоторое представление о том, что происходит.

Example of the exceptions window

Ответ 2

Проблема заключается в том, что ваш таймер запускает поток, и когда он запускает функцию обратного вызова, функция обратного вызова (updatelistview) обращается к элементам управления в потоке пользовательского интерфейса, поэтому это невозможно сделать из-за это

Ответ 3

Рассмотрите возможность использования System.Windows.Forms.Timer вместо System.Threading.Timer для приложения GUI для таймеров, которые основаны на очереди сообщений Windows, а не на выделенных потоках или пуле потоков.

В вашем сценарии для периодических обновлений пользовательского интерфейса это кажется особенно подходящим, поскольку на самом деле у вас нет фоновой работы или длительного вычисления. Вы просто хотите выполнять периодические небольшие задачи, которые должны произойти в потоке пользовательского интерфейса.