Я пытаюсь отобразить некоторую информацию о сетке, запрошенной с сервера sql. Сбор данных может занять около 10 секунд, поэтому я не хочу блокировать поток пользовательского интерфейса.Ошибка при вызове, когда форма уже закрыта
настоящее время у меня код как:
ThreadPool.QueueUserWorkItem(DataUpdateThread, new UpdateParams(year));
private struct UpdateParams
{
internal string year;
internal UpdateParams(string year)
{
this.year = year;
}
}
private void DataUpdateThread(object state)
{
DataTable dTable = new DataTable();
try
{
this.Invoke((MethodInvoker)delegate
{
//stop data editing on the grid
//scrolling marquee for user
marquee.Visible = true;
marquee.Enabled = true;
grdMain.Visible = false;
grdMain.DataSource = null;
});
UpdateParams parameters = (UpdateParams)state;
dTable = GetData(parameters.year);
}
catch (Exception ex)
{
this.Invoke((MethodInvoker)delegate
{
//log error + end user message
});
}
finally
{
this.Invoke((MethodInvoker)delegate
{
grdMain.DataSource = dTable;
grdMainLevel1.RefreshData();
marquee.Visible = false;
marquee.Enabled = false;
grdMain.Visible = true;
});
}
}
Это работает большую часть времени, за исключением, если форма его на закрывается до завершения обновления он будет врезаться с ошибкой:
Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
Я понимаю, что ошибка будет вызвана тем, что форма больше не существует, поэтому, когда секция finally пытается вызвать метод в потоке пользовательского интерфейса, она не может.
Есть ли лучший способ сделать все это? Думаю, я могу справиться с ошибками invoke, но это выглядит беспорядочно, и я думаю, что я, вероятно, пропустил более простой способ.
или this.IsHanleCreated –
@Dmitry: * 'IsHandleCreated', правильно? – abatishchev
Да, это тоже должно работать. –