如何实现会话超时等winform会话

时间:2009-05-11 12:40:57

标签: c# winforms session

您好我计划在窗口应用程序中实现类似会话的功能,但目的不是为了保存使用信息。主要目的是在会话到期后注销或至少提示登录/密码。我可以在网上找不到有关超时功能的信息。如果有人可以指点我一些资源或与我们分享他的经验,我将非常感激。感谢您阅读本文 PS:我正在使用C#.NET 2.0和visual studio 2005 merci。

2 个答案:

答案 0 :(得分:3)

您最简单的解决方案是使用Timer并将Duration属性设置为您在超时中所需的毫秒数。无论何时遇到活动,您都可以通过调用Stop然后立即呼叫Start来重置计时器。在Timer的{​​{1}}事件中放置您想要的任何代码(假设这是一个Tick),您将全部设置好。

答案 1 :(得分:2)

我已经想出了一些关于那个会话的实现,我想特别为那些有相同问题的人分享。这不完美,我会像你这样聪明的人给我一些指导,让它可以接受足够。 首先,我创建了一个类usersession

using System.Timers;
public class usersession
{
    private static bool sessionalive;
    private static Timer usertimer;

    public static bool SessionAlive
    {
        get { return sessionalive; }
        set { sessionalive = value; }
    }


    public static void  BeginTimer()
    {
        try
        {
           SessionAlive = true;
            //usertimer.Start();
           usertimer = new Timer(int.Parse(ConfigurationManager.AppSettings["sessiontime"].ToString()));
            usertimer.Enabled = true;
           usertimer.AutoReset = false;  
           usertimer.Elapsed += new ElapsedEventHandler(DisposeSession);

        }
        catch (Exception ex)
        {

            return;
        }

    }


    private static void  DisposeSession(object source, ElapsedEventArgs e)
    {
        try
        {
            SessionAlive = false;
        }
        catch (System.Exception ex)
        {
            return;
        }

    }

    public static void ResetTimer()
    {
        try
        {
            SessionAlive = true;
            usertimer.Stop();
            usertimer.Start();
        }
        catch (Exception ex)
        {

            return;
        }

    }

}

这是一个mdi应用程序所以在主窗体中我有函数startsession

public frMain()
    {
        InitializeComponent();
        StartSession();
        //SessionChecker();
    }
    public void StartSession()
   {
       try
       {
          usersession.BeginTimer();
       }
       catch (System.Exception ex)
       {
           MessageBox.Show(ex.ToString());
       }

   }

因此,每当用户点击某些内容时,我们会在此开关案例片段中检查usersession.SessioAlive属性

case "transfer":
                if (!usersession.SessionAlive)
                {
                    new LoginForm().ShowDialog();
                }
                MessageBox.Show("cash back transfert page");
                break;

在loginForm里面登录是正确的我们称之为usersession.ResetTimer()

this.DialogResult = DialogResult.OK;
        usersession.ResetTimer();
        this.Close();

现在我真的希望检查在后台运行,这是我需要你的建议。我使用forms.timer创建一个小工作,但因为forms.timer没有autoreset它做一个无限循环。这是it.it是主要形式

 private void SessionChecker()
        {
            try
            {
                check = new Timer();
                check.Enabled = true;
                check.Interval = 1000;
                check.Tick += new EventHandler(check_Tick);
            }
            catch (Exception)
            {

                throw;
            }

        }

    void check_Tick(object sender, EventArgs e)
    {
        try
        {
            if (!usersession.SessionAlive)
            {
                new LoginForm().ShowDialog();
                check.Stop();

            }

        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

    }

所以你认为我应该这样做,以便它不需要用户在会话到期时提示输入凭据之前的操作。 感谢您阅读这些长篇大论。 :)