1

次のシナリオがあります。 サーバーから複数の WCF サービスを使用する Windows Mobile 6.1 (.NET Compact Framwork 2.0) フォーム アプリケーション (複数のデバイスで同時に実行)。Windows フォーム アプリを使用するには、ユーザーはログインする必要があります。

サーバーは、SAP システムからのデータを消費します。WCF サーバーは、ログに記録されたユーザーに基づいて、SAP からいくつかの情報を取得する必要があります。そのため、私の Windows フォーム アプリは (ときどき) WCF サーバーに対してまだ実行中であることを示す必要があります。

このタスクを達成するにはどうすればよいですか? WCF サーバーの SQL サーバーを更新するバックグラウンド タスクを作成することを考えていました。(セッションコントロールのように)。

4

1 に答える 1

1

アプリケーションの電源状態の変化をリッスンできます。ドキュメントには、Windows Mobile 6.5 でのみ使用できることが示されていますが、私は .NET CF 3.5 を実行している Windows Mobile 5.0 アプリケーションで使用しています。

携帯電話のように、モバイル デバイスが長期間使用されていない場合、実際に使用されるまで、OS はバッテリーが同じレベルにあることを示します。ですから、あまり信用できません。

ただし、イベント ( 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;
}
于 2013-03-05T15:47:39.670 に答える