まず、例外が発生した場合は、新しいスレッドの開始について心配する前に、実際に例外を処理し、再起動されたスレッドが正常に実行できることを確認してください。そうしないと、クラッシュするスレッドの絶え間ないストリームと、例外のパレードを処理している間、途切れ途切れのプログラムを取得することになります。ちょっと考えさせられます。
さて、質問に答えると、最良の場合、スレッドへの参照を null にすると、無限ループに陥ります。最悪の場合、後で「th」を使用しようとすると、null であるため例外が発生します。スレッドへの参照を null にしても、関数の引数として指定したパラメーターへの参照を null にする以上に、スレッド自体を再起動する必要があることを認識させることはできません。スレッドを中止/再起動する何らかの機能がどうしても必要な場合は、次のいずれかを検討してください。
- スレッドがクラッシュして while ループから抜け出したときにイベントを発生させる、または
- スレッドが何をしているかを示すブール値/列挙型フラグを設定し、メインスレッドに頻繁にチェックさせて、エラー状態に設定されていないことを確認します。
これは私の頭の中から完全に外れているコードです。それほど良くはありませんが、一般的なアイデアを提供します。
delegate void ThreadCrashedEvent();
Event ThreadCrashedEvent threadCrashed;
Thread th;
Main()
{
threadCrashed += OnThreadCrashed();
th = new thread(myfunction);
th.Start();
}
void OnThreadCrashed()
{
th = new thread(myfunction);
th.Start();
}
void myfunction()
{
while(true)
{
try
{
LetsGetDangerous();
}
catch(exception)
{
if(threadCrashed != null)
{
threadCrashed();
return;
}
}
}