0

私は最近、提供された小規模で比較的単純な C# ライブラリを使用しなければならない一部の学部生向けのコースワークを設定しました。このライブラリの主な目的は、色付きのグリッド (操作可能)、多数のボタン、テキスト付きのラベルで構成される単純なフォームを表示することです。

それらが拡張するクラスは、実装する必要がある多数の抽象メソッドを提供します。そのうちの 1 つは UpdateAction と呼ばれ、設定された間隔で自動的に呼び出されます。

私自身は次の問題に遭遇したことはありませんが、ラボでは、一部の学生が、フォームを閉じるときに UpdateAction メソッド内から断続的に InvalidOperationException がスローされることに遭遇しました。エラー メッセージは、別のスレッドから UI を変更しようとしたときに通常表示されると予想されるエラーですが、''通常は問題のあるコントロールの名前が二重引用符で囲まれているだけです。
これが引き続き問題である場合は、ライブラリの修正バージョンを再発行する必要がありますが、このエラーが作業のマーキングに影響を与えないことは既に述べています (コードの欠陥のように見えるため)。 .

私が知る限り、学生は更新が実行されている時点でフォームを閉じている必要があり、更新スレッドが停止する前に変更中のコントロールが破棄されます。つまり、コントロールが null になっているように見えます。奇妙なことは、それがどれほど断続的であるかということです. 一部の学生は問題を抱えていませんが、他の学生は継続的に問題を抱えています. コースワークのモデル ソリューションの開発中、またはライブラリ自体の開発中に、個人的に遭遇したことはありません。

だから私の質問は、フォームのライフサイクルのどの時点でコントロールが破棄されるのでしょうか?したがって、更新スレッドを停止するコードをどこに配置するのが最善でしょうか? 現在、このコードは Dispose メソッドのフォームにありますが、別の場所に配置したほうがよいでしょうか?

4

1 に答える 1

1

どうやってスレッドを停止していますか?ウィンドウを閉じる前に停止していますか? スレッドループにフラグを設定して、確実に停止する必要があります。次に、スレッドが終了するのを待つ必要があります。

スレッド

while (running)
{
    // thread stuff
}

thread.running = false; // or use your own Stop() method that does the same thing
thread.Join();

応答性の高いシステムが必要な場合は、スレッドが停止シグナルを取得してから短時間で終了できるようにする必要があります。

于 2009-11-13T13:26:22.067 に答える