C# 如何区分用户退出聊天室和处于睡眠模式的客户端?

C# 如何区分用户退出聊天室和处于睡眠模式的客户端?,c#,wpf,web-services,C#,Wpf,Web Services,我有一个聊天客户端(C#WPF应用程序)和一个在服务器上运行的聊天服务(C#Web服务)。由于被任务管理器杀死或崩溃的应用程序无法执行代码,因此我实现了自己的方法,让服务知道用户何时脱机,即使他崩溃或杀死了应用程序: 客户端每4秒(可配置)发送一个“keep me alive”请求,当服务器接收到该请求时,会将该用户的“KeepAlive”bool属性变为true。该服务有一个计时器,当它在10秒(可配置)后关闭时,它调用一个名为“AutoKick”的方法,该方法检查每个用户的KeepAlive

我有一个聊天客户端(C#WPF应用程序)和一个在服务器上运行的聊天服务(C#Web服务)。由于被任务管理器杀死或崩溃的应用程序无法执行代码,因此我实现了自己的方法,让服务知道用户何时脱机,即使他崩溃或杀死了应用程序:

客户端每4秒(可配置)发送一个“keep me alive”请求,当服务器接收到该请求时,会将该用户的“KeepAlive”bool属性变为true。该服务有一个计时器,当它在10秒(可配置)后关闭时,它调用一个名为“AutoKick”的方法,该方法检查每个用户的KeepAlive

如果KeepAlive为false,则会将用户设置为脱机,并将其从所有聊天室中踢出,直到他再次登录或发送“让我保持活力”请求。如果KeepAlive为true,则用户不会发生任何事情,但KeepAlive设置为false,如果在接下来的10秒内没有发送任何保持活动状态的请求,则会导致用户被踢出

当用户手动关闭程序时,它会调用一个方法,告诉服务立即将其设置为脱机并踢他。如果客户端崩溃/被杀死/失去internet连接,则AutoKick会在10-20秒后发出通知,并将用户设置为脱机。到目前为止,一切都按计划进行

唯一的问题是,当用户打开睡眠模式,或者在离开电脑太长时间后简单地进入睡眠模式时,无法发送“让我保持活力”请求,因为据我所知,在睡眠期间无法执行任何代码,这会导致用户被踢并设置为脱机

我不希望用户因为不在PC机上而被设置为脱机,相反,我只希望“Status”属性(enum)从“Online”更改为“away”


有没有办法区分睡眠模式(未按预期工作)和其他导致连接丢失的原因?我愿意接受任何关于改变整个自动踢腿的想法,因为坦率地说,我不知道其他聊天应用程序如何处理这种事情。

您可以订阅
PowerModeChanged
事件,然后从客户端向服务发送一个信号,如果电源模式为
PowerModes.Suspend
,则计算机将进入睡眠状态。或者应该帮助或者