Thread.Abort を呼び出したときに最終ステートメントが実行されない理由を知っている人はいますか? 次のようなスレッド関数があります。
void ThreadFunc()
{
try
{
int counter = 0;
while (true)
{
Debug.Log ("Waiting" + counter);
Thread.Sleep(100);
++counter;
}
Debug.Log("Success.");
}
catch(ThreadAbortException ex)
{
Debug.LogWarning("Cancelled: " + ex);
}
catch(System.Exception ex)
{
Debug.LogError("Error: " + ex);
}
finally
{
Debug.Log("Finally");
}
}
Thread.Abort を使用してこのスレッドを終了します。出力に表示されるのは一連の Waiting だけですが、他の行はありません。メイン スレッドは Thread.Abort を呼び出した後も実行を続けます (つまり、子スレッドは完了するのに十分な時間があります)。Debug.Log 関数はスレッド セーフです。
これは Windows で発生します。Mono (Unity ゲーム エンジン) を使用しています。Macでは問題なく動作します。iOS ではこの動作が得られますが、デバイス/iOS のバージョンまたは XCode のバージョンに依存しているようです (まだわかりません)。Windowsでは、毎回発生します。
ところで: iOS では、別のtry {} catch {}を finally ステートメントに入れるとクラッシュします。
なぜこれが起こっているのか誰かが知っていますか?Thread.Abort および ThreadAbortException のドキュメントに記載されている内容とはかなり異なるようです。