4

我有一个函数,它有一个循环,在每个循环结束时休眠 6 秒

Thread.Sleep(TimeSpan.FromSeconds(6)); 这循环 10 次,即函数运行 60 秒,每次暂停 6 秒。

我在循环开始时进行了身份验证测试

 if (!HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    return null;
                }

所以每次它首先进行身份验证然后运行并等待 6 秒。

这是我的功能:

while (counter < 10)

            {
                if (!HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    return null;
                }

                // doing stuff

                Thread.Sleep(TimeSpan.FromSeconds(6));
                counter++;
            }

现在用户同时注销(比如在第 15 秒)。我使用 ajax 注销,因此不想重定向我的页面。即使在注销后 IsAuthenticated 对于所有 10 个循环始终为 true,并且仅在重新执行此函数时才为 false

对于注销我使用:

FormsAuthentication.SignOut();
Session.Abandon();
Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
HttpCookie cookie = HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
                if (cookie != null)
                {
                    cookie.Expires = DateTime.Now.AddDays(-1);
                    Response.Cookies.Add(cookie);
                }

但它仍然是真的.. 我想在用户注销后立即停止执行我的线程

4

1 回答 1

5

发生这种情况是因为IsAuthenticated有一个内部缓存,因为一次又一次地进行此身份验证的时间太长。因此,在您的循环内并且不离开页面,IsAuthenticatedis 不会改变。

另一方面,这是什么意思?在一个循环中,用户可以看到前 4 个想法,然后看不到其余的,因为不再经过身份验证?没有意义。

如果您想检查用户是否已经离开并离开页面,您可以做的是检查其他一些参数。

这是显示此内部缓存的代码。

public virtual bool IsAuthenticated
{
    get
    {
        if (this.m_isAuthenticated == -1)
        {
            WindowsPrincipal principal = new WindowsPrincipal(this);
            SecurityIdentifier sid = new SecurityIdentifier(IdentifierAuthority.NTAuthority, new int[] { 11 });
            this.m_isAuthenticated = principal.IsInRole(sid) ? 1 : 0;
        }
        return (this.m_isAuthenticated == 1);
    }
}
于 2012-05-19T09:26:17.323 回答