一个线程安全的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;
        }
    }

 

posted @ 2012-09-19 11:53  逝 者 如 斯  阅读(597)  评论(0编辑  收藏  举报