调用Thread.Abort时最终不会执行

时间:2014-11-20 21:56:40

标签: windows multithreading mono abort threadabortexception

有人知道为什么在调用Thread.Abort时不会执行finally语句的原因是什么?我有这样的线程函数:

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终止此线程。我在输出中看到的只是一堆等待,但没有其他线。调用Thread.Abort后我的主线程继续运行(即子线程有足够的时间来完成)。 Debug.Log函数是线程安全的。

这种情况发生在Windows上。我使用Mono (Unity游戏引擎)。在Mac上它工作正常。在iOS上我得到这种行为,但它似乎依赖于设备/ iOS版本或XCode版本(我还没想到)。在Windows上,它每次都会发生。

BTW:在iOS上,如果我将另一个 try {} catch {} 放入finally语句中,它就会崩溃。

有人知道为什么会这样吗?它似乎与Thread.Abort和ThreadAbortException的文档完全不同。

1 个答案:

答案 0 :(得分:2)

Mono不支持Constrained Execution Regions,并且在调用Thread.Abort时不完全支持catch / finally。

有一个bug