C #: «Первое исключение типа« System.InvalidOperationException »» - PullRequest
57 голосов
/ 09 декабря 2010

Работая над назначением класса в 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 ]

152 голосов
/ 09 декабря 2010

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

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

Example of the exceptions window

11 голосов
/ 09 декабря 2010

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

0 голосов
/ 09 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...