【问题标题】:How to: WCF Service check if Windows Forms user is still active?如何:WCF 服务检查 Windows 窗体用户是否仍处于活动状态?
【发布时间】:2013-02-18 21:12:44
【问题描述】:

我有以下场景:一个 Windows Mobile 6.1 (.NET Compact Framwork 2.0) Forms 应用程序(同时在多个设备上运行),它使用来自服务器的多个 WCF 服务。要使用 windows 窗体应用程序,用户必须登录。

服务器使用来自 SAP 系统的数据。 WCF 服务器必须根据记录的用户从 SAP 检索一些信息。因此,我的 Windows 窗体应用程序必须(不时)显示它们仍在运行到我的 WCF 服务器。

我可以做些什么来完成这项任务?我正在考虑创建一个更新 WCF 服务器的 SQL 服务器的后台任务。 (就像一个会话控件)。

【问题讨论】:

  • 为什么不添加一个 WCF 服务,它只是一个 SillAlive(UserName) 函数并从后台线程或设备表单应用程序中的计时器调用它?
  • WCF 需要知道哪些设备在特定时间内处于活动状态。由于某些设备最终可能会冻结或耗尽电池或断开连接(超出 wi-fi 范围)我可以t simply relly in the serviec getting called. Thats 为什么我虽然使用 SQL 来控制状态。

标签: c# winforms session windows-mobile


【解决方案1】:

您可以在您的应用程序中监听Power State 的更改。文档显示它仅适用于 Windows Mobile 6.5,但我在运行 .NET CF 3.5 的 Windows Mobile 5.0 应用程序中使用它。

就像手机一样,如果移动设备长时间不使用,操作系统会显示电池电量处于同一水平,直到实际使用为止。所以,它不是很可靠。

但是,您可以侦听事件(like POWER_STATE_CRITICAL 等)并让您的软件进行相应的更改以与您的 WCF 服务器交互。

下面是我使用的东西的编辑版本。

这不会 100% 解决您的问题,但它应该让您了解如何做您需要的事情。

using Microsoft.WindowsMobile.Status;

BatteryLevel _batteryLevel;
BatteryState _batteryState;

void Mobile5_Load(object sender, EventArgs e) {
  _batteryLevel = (BatteryLevel)SystemState.GetValue(SystemProperty.PowerBatteryStrength);
  _batteryState = (BatteryState)SystemState.GetValue(SystemProperty.PowerBatteryState);
  if (!BatteryCritical(false)) {
    // Continue
  }
}
/// <summary>
/// Sets the Battery Level and Battery State for the Mobile Device
/// <para><value>showDialog=True show the dialog box</value></para>
/// <para><value>Returns True <b>if</b> the battery is in a critical state</value></para>
/// </summary>
/// <param name="showDialog">Do you want a dialog box to be displayed or not?</param>
/// <returns>false if the Battery is NOT in the critical state</returns>
bool BatteryCritical(bool showDialog) {
  _batteryAlert = false;
  bool bad = false; // everything starts out ok. We are actually running, after all.
  _batteryLevel = (BatteryLevel)SystemState.GetValue(SystemProperty.PowerBatteryStrength);
  _batteryState = (BatteryState)SystemState.GetValue(SystemProperty.PowerBatteryState);
  bool present = ((_batteryState & BatteryState.NotPresent) != BatteryState.NotPresent);
  bool charging = ((_batteryState & BatteryState.Charging) == BatteryState.Charging);
  bool critical = ((_batteryState & BatteryState.Critical) == BatteryState.Critical);
  bool lowbatry = ((_batteryState & BatteryState.Low) == BatteryState.Low);
  Color c;
  if (present) {
    if (charging) {
      c = Color.Cyan;
    } else {
      if (critical) {
        c = Color.Orange;
        _batteryAlert = true;
      } else if (lowbatry) {
        c = Color.Yellow;
        _batteryAlert = true;
      } else {
        c = Color.White;
      }
    }
  } else {
    c = Color.Silver;
  }
  StatusPanel.BackColor = c;
  switch (_batteryLevel) {
    case BatteryLevel.VeryHigh: // (81-100%)
      BatteryPanel.BackColor = Color.Cyan;
      break;
    case BatteryLevel.High: // (61-80%)
      BatteryPanel.BackColor = Color.Lime;
      break;
    case BatteryLevel.Medium: // 41-60%)
      BatteryPanel.BackColor = Color.Yellow;
      break;
    case BatteryLevel.Low: // (21-40%)
      BatteryPanel.BackColor = Color.Orange;
      //WirelessUpdate(RadioState.Off, false);
      break;
    case BatteryLevel.VeryLow: // (0-20%)
      BatteryPanel.BackColor = Color.Red;
      //WirelessUpdate(RadioState.Off, false);
      bad = (!charging && present);
      break;
  }
  if (showDialog) {
    string msg = string.Format("Level is {0}\r\nState is {1}", _batteryLevel, _batteryState);
    if (_batteryLevel == BatteryLevel.Low) {
      msg += "\r\n\r\nThe wireless radio will be inactive until it has been charged.";
    } else if (bad == true) {
      msg += "\r\n\r\nThis Application will now close to preserve the device. Please return it to a charging base immediately.";
    }
    MessageBox.Show(msg, "Battery Meter", MessageBoxButtons.OKCancel, MessageBoxIcon.None, 0);
  }
  if (!bad) {
    StatusPanel.Refresh();
    // You could signal your app here
  } else {
    // Tell your app this device needs to turn off now.
  }
  return bad;
}

【讨论】:

  • 好吧,它并没有直接解决我的问题,尽管它也帮助并帮助解决了我的另一个问题。唯一的问题是我m using CF 2.0 and I cant 改成3.5...
  • 您可以安装CF 3.5。它可能已经在您的开发 PC 上。见How to: Install the .NET Compact Framework on a Device。就个人而言,我使用使用 Windows 资源管理器安装选项而不是使用设备部署它,因为使用设备部署选项会使您的所有构建花费太长时间。
  • 您必须在安装应用程序之前安装 CF 3.5,然后WinMobil 设备会告诉您它需要重新启动。重新启动后,安装您的应用程序。十分简单! :)
  • 谢谢伙计!我当然知道我可以安装!但问题是:由于企业限制,我无法安装它!但是非常感谢您的帮助和考虑!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2012-06-02
  • 2014-05-24
  • 1970-01-01
  • 2020-04-11
  • 2017-12-30
  • 2013-02-15
相关资源
最近更新 更多