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);
}
}
}
_
...ここで何が欠けていますか?
** [〜#〜] edit [〜#〜] **
エラーはありません。プログラムはSystem.Environment.Exit(0);
を呼び出す場合のようにendsだけです
_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).
_
例外ウィンドウのときにブレークでCommon Language Runtime Exception
のThrown
をチェックすると(Ctrl+Alt+E Visual Studioの場合)、例外がスローされるとデバッグ中に実行が中断するはずです。
これにより、何が起こっているのかについての洞察が得られるでしょう。
ここでの問題は、タイマーがスレッドを開始し、コールバック関数を実行するときに、コールバック関数(updatelistview)がUIスレッドのコントロールにアクセスしているため、これが this のためにできないことです。
GUIアプリケーションで、専用スレッドまたはスレッドプールではなくWindowsメッセージキューに基づくタイマーの場合、System.Windows.Forms.Timer
の代わりにSystem.Threading.Timer
を使用することを検討してください。
シナリオでは、UIを定期的に更新するために、バックグラウンドの作業や実行する長い計算がないため、特に適切なようです。とにかくUIスレッドで行わなければならない定期的な小さなタスクを実行したいだけです。