2

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 のドキュメントに記載されている内容とはかなり異なるようです。

4

1 に答える 1