当社の製品には、スケジュールされた間隔でアプリケーションが DLL 内のコードを実行できるようにするタスク マネージャー システムが含まれており、タスクの失敗によって関連するアプリケーションを無効にするかどうかについてのルールを指定できます。主に、データのアップロード、データのダウンロードに使用されます。 、ローカル データベースのメンテナンスなど。使用される機能の 1 つは、NTP を介してデバイスの時刻を同期し、OS のタイムゾーン情報を設定することです。このために、OpenNetCF の DateTimeHelper クラスを使用します。これは、Win32 P/Invokes のラッパーとして機能しているようです。
タスク マネージャーのその他の機能の 1 つは、タスクが割り当てられた時間枠よりも長く実行された場合、タスク マネージャーはそのタスクを Thread.Abort() して、他のタスクを実行できるようにすることです。スタックの最上位の関数が OpenNetCF.WindowsCE.NativeMethods.SetTimeZoneInformation() であるスレッドの異常終了が驚くほど多く見られます。基になる P/Invoke (SetTimeZoneInfo) が長時間ハングするのはなぜですか?
私たちのコードは Windows CE 4.2 で実行され、Windows CE 5.0 でははるかに小さなユーザー ベースで実行されます。ここでのコードは 2 つのバージョン間で同じです。これまでのところ、これが 4.2 デバイスで発生するのを見てきましたが、5.0 では発生しませんでした。また、5.0 のユーザー数が少ない場合でも、そこに存在していれば発生していたと思います。
以下の関数は、問題の原因となった関数です。タイム ゾーンの略語を完全な名前に変換し、その名前を使用して適切なタイム ゾーンを見つけ、デバイスの現在のタイム ゾーンをそのタイム ゾーンに設定しようとします。
public static bool SetTimeZone(string timeZoneAbbreviation)
{
string TimeZoneInfo = string.Empty;
bool timeZoneChanged = false;
スイッチ (timeZoneAbbreviation)
{
ケースアラスカ:
TimeZoneInfo = アラスカ_TZN;
壊す;
ケース ALASKA_ALT:
TimeZoneInfo = アラスカ_TZN;
壊す;
ケースアトランティック:
TimeZoneInfo = ATLANTIC_TZN;
壊す;
ケースATLANTIC_ALT:
TimeZoneInfo = ATLANTIC_TZN;
壊す;
ケース中央:
TimeZoneInfo = CENTRAL_TZN;
壊す;
ケース CENTRAL_ALT:
TimeZoneInfo = CENTRAL_TZN;
壊す;
ケース東部:
TimeZoneInfo = EASTERN_TZN;
壊す;
ケースインディアナ:
TimeZoneInfo = INDIANA_TZN;
壊す;
ケースハワイ:
TimeZoneInfo = HAWAII_TZN;
壊す;
ケース山:
TimeZoneInfo = MOUNTAIN_TZN;
壊す;
ケースアリゾナ:
TimeZoneInfo = ARIZONA_TZN;
壊す;
ケースパシフィック:
TimeZoneInfo = PACIFIC_TZN;
壊す;
ケース PACIFIC_ALT:
TimeZoneInfo = PACIFIC_TZN;
壊す;
デフォルト:
壊す;
}
TimeZoneInfo += "\0";
TimeZoneCollection tzc = new TimeZoneCollection();
tzc.Initialize();
foreach (tzc の TimeZoneInformation tzi)
{
文字列 tzDisplayName = tzi.DisplayName.TrimEnd(新しい char[]{'\\','0'});
if (tzDisplayName.ToUpper(CultureInfo.CurrentCulture).Equals(TimeZoneInfo.ToUpper(CultureInfo.CurrentCulture)))
{
DateTimeHelper.SetTimeZoneInformation(tzi);
System.Globalization.CultureInfo.CurrentCulture.ClearCachedData();
timeZoneChanged = true;
壊す;
}
}
timeZoneChanged を返します。
}
いつもお世話になっております。何かご意見は?