С#: "Первое исключение исключения типа" 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).
Ответы
Ответ 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, а не на выделенных потоках или пуле потоков.
В вашем сценарии для периодических обновлений пользовательского интерфейса это кажется особенно подходящим, поскольку на самом деле у вас нет фоновой работы или длительного вычисления. Вы просто хотите выполнять периодические небольшие задачи, которые должны произойти в потоке пользовательского интерфейса.