我制作了最小的演示项目来说明我的问题。您可以下载来源Here
Visual Studio 2008,.NET 3.5,IIS7,Windows 7旗舰版32位。 IIS网站在Integolved管道应用程序池(DefaultAppPool)中配置为仅用于Windows身份验证。
这是问题所在。我有一个Asp.NET MVC 2应用程序。在一个动作中,我开始一个线程。视图返回。
线程正在做它的工作......但它需要访问Thread.CurrentPrincipal.Identity.Name
BANG
IIS7的工作进程停止。我有一个窗口说: “Visual Studio即时调试器 w3wp.exe中出现未处理的异常('System.Object.DisposedException')[5524]“
我使用调试器检查并且Thread.CurrentPrincipal.Identity有效,但是Name属性被释放。
如果我在返回视图之前在操作中等待很长时间,那么Thread可以完成它的工作并且不会处理Identity.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;
}
}
那么......我做错了什么?
由于
答案 0 :(得分:1)
如果你开始一个新线程,它将不会使用相同的HttpContext(它将在另一个上下文中运行)。
您可以做的是将HttpContext.Current传递给该方法。 你为什么要传递“这个”?
看看这里...... http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx
您的DoWork将收到一个对象(将是您的HttpContext.Current)
此外,要等待3秒,您始终可以执行
Thread.sleep代码(3000); - 毫秒。
这比你在那里循环更好...更少的代码,对吗? :)