Почему Thread.Join () зависает, хотя методы в потоке вернулись?

У меня есть приложение WPF, которое использует некоторый библиотечный код для аутентификации, который должен работать в потоке однопотоковой квартиры. Мой подход заключается в создании отдельного потока для получения объекта аутентификации, блокирования до тех пор, пока поток не вернется, а затем продолжения выполнения. Однако внесколько экземпляры моего приложения зависают в Thread.Join (), даже если метод потока вернулся.

    public static ClaimsAuthenticationResult GetClientContextAndCookieCollection(string siteUrl, out CookieCollection cookieResult)
    {
        ClaimsAuthenticationResult authResult = new ClaimsAuthenticationResult();

        // Authentication module needs to run in single-thread apartment state because it uses
        // COM library calls where this is required
        Thread authenticationThread = new Thread(new ThreadStart(threadMethod));
        authenticationThread.SetApartmentState(ApartmentState.STA);
        authenticationThread.Start();

        // Block until thread completion
        authenticationThread.Join(); // Application hangs here

        return authResult;
    }

    private static void threadMethod() {
        // In proper application: set result. But for debugging, return immediately
        return;
    }

Я новичок как в многопоточности, так и в WPF, поэтому я могу делать что-то глупое. Кто-нибудь видит, что здесь происходит? Для справки, у меня не возникнет проблемы, если я не установлю поток в STA, но это требование.

[Редактировать: похоже, что ошибка возникает только тогда, когда я вызываю указанный метод через привязку проверки в представлении WPF, в частности в TextBox. Когда я вызываю тот же код в конструкторе представления, код запускается как ожидалось. Это было бы приемлемым решением, но было бы интересно узнать, что на самом деле здесь происходит.]

[Edit: код здесь был немного упрощен для отладки - в рабочем коде метод потока находится внутри объекта AuthThreadWorker, который позволяет возвращать результат процесса аутентификации в объект authResult. Но эти детали, насколько я могу судить, не имеют отношения к замораживанию, поскольку замораживание происходит даже в упрощенном коде.]

Ответы на вопрос(1)

Ваш ответ на вопрос