i have a function having a loop which sleeps for 6 second at the end of each loop
Thread.Sleep(TimeSpan.FromSeconds(6));
this loops 10 times ie the function runs for 60 seconds, each time takin a pause for 6 seconds.
i have authentication test at starting of loop
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
return null;
}
so each time it firsts authenticate then run and wait for 6 seconds.
This is my function:
while (counter < 10)
{
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
return null;
}
// doing stuff
Thread.Sleep(TimeSpan.FromSeconds(6));
counter++;
}
now the user logs out in meantime (say in 15th second) . i use ajax to logout and hence dont want to redirect my page. even after logout IsAuthenticated is always true for all 10 loops and is false only when this function is re-executed
for logout i use:
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);
}
but still its true..
i want to stop execution of my thread as soon as user logs out
This is happened because the
IsAuthenticatedhave an internal cache because is too much time-expensive to make this authentication again and again. So inside your loop and with out leaving the page, theIsAuthenticatedis not change.From the other hand, what is the meaning of this ? in a loop a user can see the first 4 thinks, and then can not see the rest because is no more authenticated ? No sense.
What you can do how ever is to check some other parameter if you like to check if the user have been leave and left the page.
This is the code that show this internal cache.