У меня есть приложение WPF, которое использует некоторый библиотечный код для аутентификации, который должен выполняться в потоке Single-Thread Apartment. Мой подход заключается в том, чтобы породить отдельный поток для получения объекта аутентификации, заблокировать его до возвращения потока и затем продолжить выполнение. Однако в некоторых случаях мое приложение зависает на 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, но это требование.
[Edit: Похоже, что ошибка возникает, только когда я вызываю указанный метод через привязку валидации в представлении WPF, в частности на TextBox. Когда я вызываю тот же код в конструкторе представления, код работает как ожидалось. Это было бы приемлемым обходным решением, но было бы интересно узнать, что на самом деле здесь происходит]
.[Edit: Код здесь был немного упрощен для отладки - в производственном коде метод потока находится внутри объекта AuthThreadWorker, который позволяет возвращать результат процесса аутентификации в объект authResult. Но эти детали, насколько я могу судить, не связаны с зависанием, поскольку зависание происходит даже в упрощенном коде.]