代码之家  ›  专栏  ›  技术社区  ›  vIceBerg

Identity.Name在IIS7 ASP.NET MVC应用程序线程中释放

  •  0
  • vIceBerg  · 技术社区  · 15 年前

    我做了一个最小的演示项目来说明我的问题。你可以下载源文件 Here

    Visual Studio 2008,.NET 3.5,iis7,Windows 7 Ultimate 32位。已配置IIS网站 只有 用于集成管道应用程序池(默认应用程序池)中的Windows身份验证。

    这就是问题所在。我有一个ASP.NET MVC 2应用程序。在一个动作中,我开始一个线程。视图返回。

    线程正在做它的工作…但它需要访问thread.currentprincipal.identity.name

    IIS7的工作进程停止。我有一个窗口说: “Visual Studio实时调试器 W3wp.exe[5524]中发生未处理的异常(“System.Object.DisposedException”)”

    我使用调试器进行了检查,thread.currentprincipal.identity有效,但name属性已被释放。

    如果在操作返回视图之前长时间等待,那么线程可以完成它的任务和标识.name不会被释放。所以我认为当返回视图时名称会被释放。

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

        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;
            }
        }
    

    所以…我做错什么了?

    谢谢

    1 回复  |  直到 15 年前
        1
  •  1
  •   turtlepick    15 年前

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

    您可以将httpContext.current传递给该方法。 你为什么路过“这个”?

    看看这里…… http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx

    您的DoWork将收到一个对象(它将是您的httpContext.current)

    另外,要等待3秒钟,您可以

    thread.sleep(3000);-毫秒。

    比你在那里的那个循环要好…少点代码,对吗?:)