SQLサーバーから照会されたグリッドにいくつかの情報を表示しようとしています。データ収集には約10秒かかることがあるので、UIスレッドをロックしたくありません。
私は現在次のようなコードを持っています:
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またはBeginInvokeを呼び出すことはできません。
フォームが存在しなくなったためにエラーが発生することを理解しています。そのため、finallyセクションがUIスレッドでメソッドを呼び出そうとすると、呼び出せなくなります。
このすべてを行うためのより良い方法はありますか?私は呼び出しエラーを処理できると思いますが、それは厄介に見え、おそらくもっと簡単な方法を逃したと思います。