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