C# 为什么即使线程中的方法已返回,Thread.Join()仍挂起?
我有一个WPF应用程序,它使用一些库代码进行身份验证,需要在单线程单元线程中运行。我的方法是生成一个单独的线程来获取身份验证对象,阻塞直到线程返回,然后继续执行。但是,在某些情况下,我的应用程序挂起在Thread.Join()上,即使Thread方法已返回C# 为什么即使线程中的方法已返回,Thread.Join()仍挂起?,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个WPF应用程序,它使用一些库代码进行身份验证,需要在单线程单元线程中运行。我的方法是生成一个单独的线程来获取身份验证对象,阻塞直到线程返回,然后继续执行。但是,在某些情况下,我的应用程序挂起在Thread.Join()上,即使Thread方法已返回 public static ClaimsAuthenticationResult GetClientContextAndCookieCollection(string siteUrl, out CookieCollection coo
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;
}
我对multhththreading和WPF都是新手,所以我可能在做一些愚蠢的事情。有人看到这里发生了什么吗?作为记录,如果不将线程设置为STA,我不会遇到问题,但这是一个要求
[编辑:似乎只有在我通过WPF视图中的验证绑定调用指定方法时才会发生错误,特别是在文本框上。当我在视图的构造函数中调用相同的代码时,代码会按预期运行。这将是一个可行的解决方法,但了解实际情况会很有趣。]
[编辑:为了调试,这里的代码已经简化了一点-在生产代码中,thread方法位于AuthThreadWorker对象内,该对象允许将身份验证过程的结果返回给authResult对象。但据我所知,这些细节与冻结无关,因为即使在简化代码中也会发生冻结.]基于您的代码;看起来您的操作是正确的,但线程从未真正终止。请尝试在线程中的函数末尾设置断点,而不是return关键字(以防您在return语句中执行某种处理,从而阻止线程退出),如下图所示
。使用authenticationThread.Name(或示例中所示的mthread.Name)命名线程也有助于调试。如果线程确实终止,您应该看到“线程‘yourname’(0x143c)已退出,代码为0(0x0)。”在Visual Studio的输出窗口中。您是否100%确定线程的方法已完成?请尝试附加一个debbuger并在“return;”上设置一个断点,以检查您是否真的命中了它。如果是,请检查哪个线程。thread方法实际上做了什么,我看不出发布的代码有任何错误?@guillome:断点确实命中了线程是一个未命名的工作线程,ID 4492,托管ID 9,位置与运行代码的类相同(ClaimsAuthenticationModule)。有7个线程正在运行,可能与WPF有关。值得注意的是,当我在WPF视图的构造函数中调用所需的代码时,问题并没有发生。当我从TextBox验证代码调用代码时,问题确实发生了。我想我可以将此作为一种解决方法,但最好知道发生了什么。JodreLH:Thread方法在这个测试用例中什么都不做,ThreadAuthenticationThread=new Thread(new ThreadStart(threadMethod(authResult));这行代码是怎么编译的?你粘贴代码时有没有出错?可能是真的吧threadMethod返回某个值,而不是void?+1作为有关线程名称的提示。放置在thread方法最后一个大括号上的断点确实被击中,但调试器在经过它时不报告“thread Exit”。在相同的场景中,调试器报告“thread Exit”当代码由我而不是WPF调用时。由于您提到了WPF,您可能会间接调用“onpropertychanged”,因为您设置了一些属性值。在这种情况下,changenotification将等待UI线程,反之亦然。