当社の製品には、スケジュールされた間隔でアプリケーションが 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 を返します。 }
いつもお世話になっております。何かご意見は?