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ループすべてで常に真であり、この関数が再実行された場合にのみ偽になります

ログアウトには次を使用します。

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、この認証を何度も行うには時間がかかりすぎるため、内部キャッシュがあるために発生します。したがって、ループ内でページを離れることIsAuthenticatedなく、は変更されません。

一方、これの意味は何ですか?ループでは、ユーザーは最初の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 に答える