一个线程安全的IsolatedStorageSettingsHelper类

 

在 Silverlight for Windows Phone 上,IsolatedStorageSettings 不是线程安全的,将在调用 Save() 时引发 IsolatedStorageException,参见MSDN。问题比较简单,直接上代码。

 

    /// <summary>

    /// IsolatedStorageSettings是非线程安全的,多线程环境下对临界资源的访问应该互斥进行

    /// 警告,对于IsolatedStorageSettings的访问都应该通过本类,严禁直接访问。

    /// </summary>

    public class ApplicationSettingHelper

    {

        private static object _sync = new object();



        /// <summary>

        /// 

        /// </summary>

        /// <param name="key"></param>

        /// <param name="value"></param>

        /// <returns></returns>

        public static bool AddEntity(string key, object value)

        {

            bool isAdd = false;

            try

            {

                if (!string.IsNullOrEmpty(key) && value != null)

                {

                    lock (_sync)

                    {

                        if (IsolatedStorageSettings.ApplicationSettings.Contains(key) == false)

                        {

                            IsolatedStorageSettings.ApplicationSettings.Add(key, value);

                            IsolatedStorageSettings.ApplicationSettings.Save();



                            isAdd = true;

                        }

                        else

                        {

                            IsolatedStorageSettings.ApplicationSettings[key] = value;

                            IsolatedStorageSettings.ApplicationSettings.Save();



                            isAdd = true;

                        }

                    }

                }

            }

            catch (Exception exception)

            {

                LoggingHelper.Log("AddEntity", exception, true);

            }

            return isAdd;

        }



        /// <summary>

        /// 

        /// </summary>

        /// <param name="key"></param>

        /// <returns></returns>

        public static string GetEntityString(string key)

        {

            string strCacheEntiy = string.Empty;

            try

            {

                if (!string.IsNullOrEmpty(key))

                {

                    lock (_sync)

                    {

                        if (IsolatedStorageSettings.ApplicationSettings.Contains(key) == true)

                        {

                            strCacheEntiy = IsolatedStorageSettings.ApplicationSettings[key].ToString();

                        }

                    }

                }

            }

            catch (Exception exception)

            {

                LoggingHelper.Log("GetEntityString", exception,

                                  true);

            }

            return strCacheEntiy;

        }



        /// <summary>

        /// 

        /// </summary>

        /// <typeparam name="T"></typeparam>

        /// <param name="key"></param>

        /// <returns></returns>

        public static T GetEntityObj<T>(string key)

        {

            T objCacheEntity;

            try

            {

                if (!string.IsNullOrEmpty(key))

                {

                    lock (_sync)

                    {

                        if (IsolatedStorageSettings.ApplicationSettings.Contains(key) == true)

                        {

                            var settings = IsolatedStorageSettings.ApplicationSettings;



                            settings.TryGetValue(key, out objCacheEntity);



                            return objCacheEntity;

                        }

                    }

                }

            }

            catch (Exception exception)

            {

                LoggingHelper.Log("GetEntityObj", exception,

                                  true);

            }

            return default(T);

        }



        public static bool RemoveEntity(string key)

        {

            bool isRemove = false;

            try

            {

                if (!string.IsNullOrEmpty(key))

                {

                    lock (_sync)

                    {

                        if (IsolatedStorageSettings.ApplicationSettings.Contains(key) == true)

                        {

                            IsolatedStorageSettings.ApplicationSettings.Remove(key);

                            IsolatedStorageSettings.ApplicationSettings.Save();

                            isRemove = true;

                        }

                    }

                }

            }

            catch (Exception exception)

            {

                LoggingHelper.Log("RemoveEntity", exception,

                                  true);

            }



            return isRemove;

        }



        /// <summary>

        /// 

        /// </summary>

        /// <param name="key"></param>

        /// <returns></returns>

        public static bool IsIsolateStorageKeyExists(string key)

        {

            bool isExist = false;

            try

            {

                if (!string.IsNullOrEmpty(key))

                {

                    lock (_sync)

                    {

                        isExist = IsolatedStorageSettings.ApplicationSettings.Contains(key);

                    }

                }

            }

            catch (Exception exception)

            {

                LoggingHelper.Log("IsIsolateStorageKeyExists", exception,

                                  true);

            }

            return isExist;

        }

    }

 

你可能感兴趣的:(线程安全)