C# 2.0 在Windows应用程序中模拟会话

C# 2.0 在Windows应用程序中模拟会话,c#-2.0,C# 2.0,我正在开发一个windows应用程序。我需要在win应用程序中模拟会话(我们在web应用程序中有),如果用户在某段时间内处于非活动状态,他将注销。用户登录状态保存在数据库中 有什么创新的想法吗?我想到的是当计时器为零时,使用BackgroundWorker注销用户。此计时器在用户执行的每个操作时都会重置。或者,它甚至可以连接到鼠标或键盘事件,这样当用户不移动鼠标或不使用键盘时,计时器就会倒计时,直到达到注销时间。您不需要会话(或CallContext,或任何其他内容),只需一个“用户存储”,并有

我正在开发一个windows应用程序。我需要在win应用程序中模拟会话(我们在web应用程序中有),如果用户在某段时间内处于非活动状态,他将注销。用户登录状态保存在数据库中


有什么创新的想法吗?

我想到的是当计时器为零时,使用BackgroundWorker注销用户。此计时器在用户执行的每个操作时都会重置。或者,它甚至可以连接到鼠标或键盘事件,这样当用户不移动鼠标或不使用键盘时,计时器就会倒计时,直到达到注销时间。

您不需要会话(或CallContext,或任何其他内容),只需一个“用户存储”,并有一个限制:

用户登录或显示某些活动后,您必须保存该活动的日期/时间。下次,当用户想要做某事时,只需将(lastactivity+logouttime)与实际日期/时间进行比较

该进程的概要可以是:

              [User login]
                   |
                   !
 [User 'store' saves user date + login time]
 [This is a singleton                      ]

                  ...

[Next time user wants to do something. The   ]
[program asks user data from the user 'store']
                   |
                   !
[If the actual time is greater than user     ]
[lastactivity + LOGOUTTIME, user cannot do it]
[If not, then update last activity           ]
UserStore可以实现为字典并用作:

// Log in
Singleton.UserStore.Add("John", new UserData( yourUserObject, DateTime.Now));

...

// Check (ie. in a property-get)
var userData = Singleton.UserStore["John"];
if (userData.LastActivityDate + _LOGOUTIME > DateTime.Now()) 
{
   throw UserAutomaticallyLoggedOut();
}
else
{
   userData.LastActivityDate = DateTime.Now();
}

您可以在应用程序中创建一个类,该类具有某种超时,每次用户与软件交互时都会重置超时。如果达到超时,则用户将注销


这里的棘手问题是检测用户交互。在ASP.NET中非常简单,基本上只需要检查页面请求。在windows窗体应用程序中,您需要更详细地监视或输入(例如,任何文本框中的任何按键都将是用户交互)。我想KeyPreview属性和表单上的KeyPress事件侦听器可能是一个很好的方法。

首先,你说的不活动是什么意思?在网络上,你试图模拟一个没有的状态。然而,在客户端应用程序中,您可以获得各种事件,甚至MouseMove。Onde的想法是,您可以在标准输入控件(如TextBox、Button等)之外创建UserControls,并让它们在调用事件时更新某种计时器对象。另一种方法是放弃UserControl内容,只更新您创建的每个事件处理程序中的计时器。根据表单本身的MouseMove或KeyDown事件更新计时器可能会更简单。

您可能甚至不需要BackgroundWorker来完成此操作——只需使用普通的UI线程计时器。缺点是用户不会自动注销。他必须做点什么才能注销。如果你的意思是连接鼠标和键盘事件并以这种方式监视用户活动,那就好了。但是,如果“存储”在数据库中,则有许多不必要的数据库访问。最好用定时器工作。没错。但我认为很少有人不检查用户,而是以用户的名义做一些事情。如果真的有必要的话,定时器是可以使用的。你的解决方案的另一件事是,用户总是在LOGOUTTIME过去后注销。您需要存储并比较_LASTACTIONTIME,而不是登录时间。但这可能就是你的意思。现在我很挑剔,但你的评论“Check(即,in a get)”,表明代码是用于网络应用程序的。想想看,WinApp中不需要单例,因为您只需将最后一个操作与当前时间进行比较,并且在任何时间点都有一个用户在使用WinApp。如果您愿意,您可以有多个用户,但您仍然需要的是一个用户列表(如您所建议的词典)和lastactiontimes,但不需要一个单一实例,因为不可能为该列表创建多个实例。我相信你可能误解了这个问题。或者是我?当然有成百上千的人在使用WinApp,但每个用户都有自己的副本和自己的列表(字典),而不必是一个单件。