在Windows登录屏幕上的后台C#WinForms应用程序中进行网络连接时发生DNS错误



我有一个应用程序,它每2分钟进行一次网络连接。该应用程序不是Windows服务,它是在当前Windows用户的上下文下运行的。

如果Windows进入睡眠模式,然后醒来(以便显示Windows登录屏幕),我稍后会在日志中看到,我的应用程序进行的任何连接尝试都会失败,并显示"无法解析远程名称"WebException。此错误发生在登录屏幕处于活动状态期间。后来,当用户登录时,他们看到我的应用程序抱怨"发生了错误"。

是否在某个地方记录了(如果后台应用程序是在用户的上下文下执行的,该用户在该计算机上有打开的会话,但当前该会话已锁定)?我能在我的C#应用程序中检测到这种情况吗(如果登录屏幕处于活动状态,就不要尝试访问网络)?

此外,也许还有更多类似的情况我应该处理?我的意思是,也许我不应该检查登录屏幕是否处于活动状态,也许有一种更通用的方法,比如WinAPI函数,它只是"告诉"我Windows是否处于允许我访问网络之类的状态。

同时,我不想只使用"网络可用"功能,因为它无法让我了解是否根本没有网络(这对我的应用程序来说是错误的),或者只是因为计算机被锁定或其他原因而导致网络现在不可用(没有错误,我只是应该稍后重试)。

我正在64位Windows 7 SP1上测试这一点,但我怀疑这种行为在所有版本中都是一致的,我需要找到优雅处理它的方法。

要阻止应用程序尝试访问网络,请查看SystemEvents.SessionSwitch

如果将事件处理程序挂接到该事件处理程序,则每次会话更改时都会触发一个事件。事件参数的属性将告诉您会话是否被锁定/解锁。然后,您可以根据需要停止/启动网络访问。

例如:

private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
    if (e.Reason == SessionSwitchReason.SessionLock)
    {
        // session was locked
    }
    else if (e.Reason == SessionSwitchReason.SessionUnlock)
    {
        // session was unlocked
    }
}

还有一些其他原因也可以处理:

  • 用于远程桌面连接的RemoteConnect/RemoteDisconnect
  • ConsoleConnect/ConsoleDisconnect,用于直接连接到控制台的远程桌面(mstsc /console

最新更新