наконец не выполняется при вызове Thread.Abort

Кто-нибудь знает причину, по которой оператор finally не будет выполняться при вызове 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. Все, что я вижу в выводе, это куча ожидания, но никаких других строк. Мой основной поток продолжает работать после вызова Thread.Abort (т.е. у дочернего потока достаточно времени для завершения). Функции Debug.Log являются потокобезопасными.

Это происходит в Windows. Я использую Mono (игровой движок Unity). На Маке работает нормально. В iOS я получаю такое поведение, но, похоже, оно зависит от версии устройства/iOS или версии XCode (я еще не понял). В Windows это происходит каждый раз.

Кстати: на iOS происходит сбой, если я добавляю еще одну попытку {} catch {} в оператор finally.

Кто-нибудь знает, почему это происходит? Кажется, это сильно отличается от того, что говорится в документации Thread.Abort и ThreadAbortException.


person Paulius Liekis    schedule 20.11.2014    source источник


Ответы (1)


Mono не поддерживает ограниченные области выполнения. и не полностью поддерживает catch/finally при вызове Thread.Abort.

Об этом есть ошибка.

person Sergey Zhukov    schedule 20.11.2014