Iis 7 Identity.Name在IIS7 Asp.NET MVC应用程序线程中释放

Iis 7 Identity.Name在IIS7 Asp.NET MVC应用程序线程中释放,iis-7,asp.net-mvc-2,multithreading,Iis 7,Asp.net Mvc 2,Multithreading,我制作了最小的演示项目来说明我的问题。您可以下载源代码 Visual Studio 2008、.NET 3.5、IIS7、Windows 7终极32位。IIS网站仅配置为在集成创建的管道应用程序池(DefaultAppPool)中进行Windows身份验证 问题出在这里。我有一个Asp.NETMVC2应用程序。在一个动作中,我启动一个线程。视图返回 线程正在执行它的任务。。。但它需要访问Thread.CurrentPrincipal.Identity.Name 砰 IIS7的工作进程停止。我有一

我制作了最小的演示项目来说明我的问题。您可以下载源代码

Visual Studio 2008、.NET 3.5、IIS7、Windows 7终极32位。IIS网站仅配置为在集成创建的管道应用程序池(DefaultAppPool)中进行Windows身份验证

问题出在这里。我有一个Asp.NETMVC2应用程序。在一个动作中,我启动一个线程。视图返回

线程正在执行它的任务。。。但它需要访问Thread.CurrentPrincipal.Identity.Name

IIS7的工作进程停止。我有一扇窗户,上面写着: “Visual Studio实时调试器 w3wp.exe[5524]中发生未经处理的异常('System.Object.DisposedException')”

我使用调试器进行了检查,Thread.CurrentPrincipal.Identity有效,但已释放Name属性

如果我在操作返回视图之前等待了很长时间,那么线程可以完成它的工作,并且不会释放Identity.Name。因此,我认为当返回视图时,名称会被释放

为了便于讨论,以下是线程运行的代码(但您也可以下载演示项目。链接位于本文顶部):

所以。。。我做错了什么


谢谢

如果您启动一个新线程,它将不会使用相同的HttpContext(它将在另一个上下文上运行)

您可以做的是将HttpContext.Current传递给该方法。 你为什么要通过“这个”

看看这里。。。

您的DoWork将接收一个对象(即您的HttpContext.Current)

此外,要等待3秒钟,您始终可以执行以下操作:

线程。睡眠(3000);-毫秒

这比你在那里做的更好。。。更少的代码,对吗?:)

    private void Run()
    {
        const int SECTOWAIT = 3;
        //wait SECTOWAIT seconds
        long end = DateTime.Now.Ticks + (TimeSpan.TicksPerSecond * SECTOWAIT);
        while (DateTime.Now.Ticks <= end)
            continue;

        //Check the currentprincipal. BANG!!!!!!!!!!!!!
        var userName = Thread.CurrentPrincipal.Identity.Name;
    }
    public void Start()
    {
        Thread thread = new Thread(new ParameterizedThreadStart(ThreadProc));

        thread.SetApartmentState(ApartmentState.MTA);
        thread.Name = "TestThread";

        thread.Start(this);
    }

    static void ThreadProc(object o)
    {
        try
        {
            Builder builder = (Builder)o;

            builder.Run();
        }
        catch (Exception ex)
        {
            throw;
        }
    }