في نظام التشغيل Windows CE .NET 4.2 لماذا قد SetTimeZoneInfo تعليق ؟

StackOverflow https://stackoverflow.com/questions/413878

سؤال

لدينا المنتج يحتوي على مهمة مدير النظام الذي يسمح بتشغيل تطبيقات البرمجية في ملف DLL على الفاصل الزمني المقرر ، تحديد القواعد حول ما إذا كان فشل مهمة يجب تعطيل تطبيق ذات الصلة ، وما إلى ذلك.في الغالب يستخدم البيانات تحميل البيانات-تحميل المحلية صيانة قاعدة البيانات ، إلخ.واحدة من المهام المستخدمة لمزامنة أجهزة الوقت عبر NTP ووضع نظام التشغيل' التوقيت المعلومات.لهذا ، فإننا نستخدم OpenNetCF هو DateTimeHelper الدرجة التي يبدو بمثابة التفاف حول Win32 P/استدعاء.

واحدة من الميزات الأخرى من إدارة المهام هو أنه إذا كانت مهمة لفترة أطول من الوقت المخصص نافذة مدير المهام سوف الخيط.إحباط() للسماح مهام أخرى لتشغيل.نحن نرى عدد هائل من موضوع الإجهاض في أعلى وظيفة على المكدس هو OpenNetCF.WindowsCE.NativeMethods.SetTimeZoneInformation().لماذا الكامنة P/استدعاء (SetTimeZoneInfo) تعليق لمثل هذا الوقت الطويل ؟

لدينا كود يعمل على Windows CE 4.2, و مع أصغر بكثير سيرباسي على Windows CE 5.0 -- الرمز هنا هو نفسه بين اثنين من الإصدارات.حتى الآن, لقد رأيت هذا يحدث على 4.2 الأجهزة ولكن أبدا على 5.0 ، وحتى مع عدد أقل من المستخدمين على 5.0, أعتقد أنني قد رأيت ذلك لو كان حاضرا هناك.

وظيفة أدناه هي وظيفة من المشكلة ينبع.كان تحويل المنطقة الزمنية اختصار إلى اسمها الكامل ، ثم يستخدم اسم لإيجاد الوقت المناسب المنطقة ومحاولات لضبط الجهاز المنطقة الزمنية الحالية إلى أن واحد.

        public static bool SetTimeZone(string timeZoneAbbreviation)
        {
            string TimeZoneInfo = string.Empty;
            bool timeZoneChanged = false;

            switch (timeZoneAbbreviation)
            {
                case ALASKA:
                    TimeZoneInfo = ALASKA_TZN;
                    break;
                case ALASKA_ALT:
                    TimeZoneInfo = ALASKA_TZN;
                    break;
                case ATLANTIC:
                    TimeZoneInfo = ATLANTIC_TZN;
                    break;
                case ATLANTIC_ALT:
                    TimeZoneInfo = ATLANTIC_TZN;
                    break;
                case CENTRAL:
                    TimeZoneInfo = CENTRAL_TZN;
                    break;
                case CENTRAL_ALT:
                    TimeZoneInfo = CENTRAL_TZN;
                    break;
                case EASTERN:
                    TimeZoneInfo = EASTERN_TZN;
                    break;
                case INDIANA:
                    TimeZoneInfo = INDIANA_TZN;
                    break;
                case HAWAII:
                    TimeZoneInfo = HAWAII_TZN;
                    break;
                case MOUNTAIN:
                    TimeZoneInfo = MOUNTAIN_TZN;
                    break;
                case ARIZONA:
                    TimeZoneInfo = ARIZONA_TZN;
                    break;
                case PACIFIC:
                    TimeZoneInfo = PACIFIC_TZN;
                    break;
                case PACIFIC_ALT:
                    TimeZoneInfo = PACIFIC_TZN;
                    break;

                default:                    
                    break;
            }

            TimeZoneInfo += "\0";

            TimeZoneCollection tzc = new TimeZoneCollection();
            tzc.Initialize();

            foreach (TimeZoneInformation tzi in tzc)
            {
                string tzDisplayName = tzi.DisplayName.TrimEnd(new char[]{'\\','0'});

                if (tzDisplayName.ToUpper(CultureInfo.CurrentCulture).Equals(TimeZoneInfo.ToUpper(CultureInfo.CurrentCulture)))
                {
                    DateTimeHelper.SetTimeZoneInformation(tzi);
                    System.Globalization.CultureInfo.CurrentCulture.ClearCachedData();
                    timeZoneChanged = true;
                    break;
                }
            }

            return timeZoneChanged;
        }

بفضل كما هو الحال دائما لمساعدتكم.أي أفكار ؟

هل كانت مفيدة؟

المحلول

على DateTimeHelper.SetTimeZoneInformation دعوة رقيقة جدا التفاف حول P/تحتج إلى SetTimezoneInformation API (أنا فقط التحقق من ذلك في المصدر).فإنه يجعل أساسا الدعوة و الشيكات عودة رمز لا أكثر ، حتى أن كثيرا يستبعد SDF نفسها الجذري.

بجانب النظر في MSDN دكتور على SetTimezoneInformation, هو حقا واضحة متزامن الاتصال التي تقوم بإرجاع TRUE أو FALSE.هذا يقول لي ان API هو على الأرجح ليس الجذري سواء.

شيء واحد أن نتذكر في CE هو أنه يمكنك أبدا الافتراض الأساسي هو لا تشوبه شائبة becasue يتم ذلك من قبل OEM وبالتالي يمكن أن يكون الاختلافات.حقيقة أن ترى الفشل في 4.2 وليس 5.0 من شأنه أن يؤدي بي إلى تحقق ما يلي:

  1. تأكد من 4.2 صورة الجهاز لديه كل QFEs التطبيقية
  2. انظر إذا كان هناك نظام التشغيل رمز الفرق بين 4.2 ، 5.0 على التوقيت الاشياء (أشك في ذلك ولكن ليس لدي PB 4.2 تثبيت أي أطول).
  3. التحقق من OEM التنفيذ من أجل تحديد الوقت.تغيير المنطقة ضمنا يجعل الدعوة إلى ضبط الوقت و من الممكن أن يكون هناك خلل في 4.2 BSP التي لديها إمكانية قفل أو السباق الذي كنت ضرب.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top