のは、Windowsフォームの内側に、私はこのような長時間実行タスクを開始すると仮定しよう:フォームが閉じられた後、ThreadPool WaitCallbackがそれを呼び出すと、フォームはどうなりますか?
ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateDailyTasksChart));
次に、この機能はしばらくの間、実行されますが、それが終了する前に、私は、ウィンドウを閉じます。
private void UpdateDailyTasksChart (object param)
{
//Call Data Access Layer, go get MySQL Data. But I close the Form.
UICallback(chartData); //The Form is closed when this is executed.
}
そして今ここにUICallbackが何をするかです:
private delegate void UICallbackDel(object chartData);
private void UICallback (object chartData)
{
if (InvokeRequired)
{
this.Invoke(new UICallbackDel(UICallback), chartData);
}
else
{
aButtonOnMyForm.Visible = false; //But the Form has been closed!
}
}
不思議なことに、このコードはクラッシュしません。
Form_Closedイベントにブレークポイントを設定しました。はを実行します。フォームがまだ存在するかどうかは、たとえばクラス変数で宣言するなどしてチェックしていません。しかし、私の推測はそれがそうであるということです。
質問:私のスレッドが終了したときだけ、GCはフォームを収集するでしょうか?それとも何が起こるのですか?
フォームは明示的に処理されていますか? – Jon
これは事故によって動作します。フォームが破棄されたときにVisibleプロパティがすでにfalseになっているので、実際に何も実行されていないのは幸いです。爆弾は1ヶ月に1度のレースの可能性を排除するものではありません。 –
@ハンスパッサント:フォームが処分されている場合は、Visibleプロパティにアクセスするだけでクラッシュしますね。とにかく、.Visible行は多くの中で1つだけです。私はそこでいくつかの他の機能を実行しています。スレッドが実行を終了し、それらの行のいずれもクラッシュしない場合、フォームにいくつかの変更が行われます。しかし、私はFormを明示的に処分しなかったので、Phongが言ったように、GCはまだその仕事をする必要はなかったので、Formは終了してスレッドが終了するのを待っています。どちらが迷惑です。私はThreadPoolをあきらめて、より多くの制御を可能にするThreadオブジェクトを使用する必要があります。 – Axonn