C# 为什么即使线程中的方法已返回,Thread.Join()仍挂起?

C# 为什么即使线程中的方法已返回,Thread.Join()仍挂起?,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个WPF应用程序,它使用一些库代码进行身份验证,需要在单线程单元线程中运行。我的方法是生成一个单独的线程来获取身份验证对象,阻塞直到线程返回,然后继续执行。但是,在某些情况下,我的应用程序挂起在Thread.Join()上,即使Thread方法已返回 public static ClaimsAuthenticationResult GetClientContextAndCookieCollection(string siteUrl, out CookieCollection coo

我有一个WPF应用程序,它使用一些库代码进行身份验证,需要在单线程单元线程中运行。我的方法是生成一个单独的线程来获取身份验证对象,阻塞直到线程返回,然后继续执行。但是,在某些情况下,我的应用程序挂起在Thread.Join()上,即使Thread方法已返回

    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线程,反之亦然。