我试图使用文件IO操作实现读写操作,并将这些操作封装在一起TransformBlock
,以使这些操作线程安全,而不是使用锁定机制.
但问题是,当我尝试并行写入5个文件时,有一个异常的内存,并且在使用此实现时它阻止了UI线程.该实现在Windows Phone项目中完成.请说明这个实现有什么问题.
文件IO操作
public static readonly IsolatedStorageFile _isolatedStore = IsolatedStorageFile.GetUserStoreForApplication(); public static readonly FileIO _file = new FileIO(); public static readonly ConcurrentExclusiveSchedulerPair taskSchedulerPair = new ConcurrentExclusiveSchedulerPair(); public static readonly ExecutionDataflowBlockOptions exclusiveExecutionDataFlow = new ExecutionDataflowBlockOptions { TaskScheduler = taskSchedulerPair.ExclusiveScheduler, BoundedCapacity = 1 }; public static readonly ExecutionDataflowBlockOptions concurrentExecutionDataFlow = new ExecutionDataflowBlockOptions { TaskScheduler = taskSchedulerPair.ConcurrentScheduler, BoundedCapacity = 1 }; public static async TaskLoadAsync (string fileName) { T result = default(T); var transBlock = new TransformBlock (async fName => { return await LoadData (fName); }, concurrentExecutionDataFlow); transBlock.Post(fileName); result = await transBlock.ReceiveAsync(); return result; } public static async Task SaveAsync (T obj, string fileName) { var transBlock = new TransformBlock , Task> (async tupleData => { await SaveData(tupleData.Item1, tupleData.Item2); }, exclusiveExecutionDataFlow); transBlock.Post(new Tuple (obj, fileName)); await transBlock.ReceiveAsync(); }
MainPage.xaml.cs用法
private static string data = "vjdsskjfhkjsdhvnvndjfhjvkhdfjkgd" private static string fileName = string.Empty; private ListDataLstSample = new List (); private ObservableCollection TestResults = new ObservableCollection (); private static string data1 = "hjhkjhkhkjhjkhkhkjhkjhkhjkhjkh"; List allTsk = new List (); private Random rand = new Random(); private string fileNameRand { get { return rand.Next(100).ToString(); } } public MainPage() { InitializeComponent(); for (int i = 0; i < 5; i ++) { DataLstSample.Add((i % 2) == 0 ? data : data1); } } private void Button_Click(object sender, RoutedEventArgs e) { AppIsolatedStore_TestInMultiThread_LstResultShouldBeEqual(); } public async void AppIsolatedStore_TestInMultiThread_LstResultShouldBeEqual() { TstRst.Text = "InProgress.."; allTsk.Clear(); foreach(var data in DataLstSample) { var fName = fileNameRand; var t = Task.Run(async () => { await AppIsolatedStore.SaveAsync (data, fName); }); TestResults.Add(string.Format("Writing file name: {0}, data: {1}", fName, data)); allTsk.Add(t); } await Task.WhenAll(allTsk); TstRst.Text = "Completed.."; }
保存并加载数据异步
////// Load object from file /// private static async TaskLoadData (string fileName) { T result = default(T); try { if (!string.IsNullOrWhiteSpace(fileName)) { using (var file = new IsolatedStorageFileStream(fileName, FileMode.OpenOrCreate, _isolatedStore)) { var data = await _file.ReadTextAsync(file); if (!string.IsNullOrWhiteSpace(data)) { result = JsonConvert.DeserializeObject (data); } } } } catch (Exception ex) { //todo: log the megatron exception in a file Debug.WriteLine("AppIsolatedStore: LoadAsync : An error occured while loading data : {0}", ex.Message); } finally { } return result; } /// /// Save object from file /// private static async Task SaveData(T obj, string fileName) { try { if (obj != null && !string.IsNullOrWhiteSpace(fileName)) { //Serialize object with JSON or XML serializer string storageString = JsonConvert.SerializeObject(obj); if (!string.IsNullOrWhiteSpace(storageString)) { //Write content to file await _file.WriteTextAsync(new IsolatedStorageFileStream(fileName, FileMode.Create, _isolatedStore), storageString); } } } catch (Exception ex) { //todo: log the megatron exception in a file Debug.WriteLine("AppIsolatedStore: SaveAsync : An error occured while saving the data : {0}", ex.Message); } finally { } }
编辑:
它有内存异常的原因是因为我所采用的数据字符串太大的一个原因.字符串是链接:http://1drv.ms/1QWSAsc
但第二个问题是,如果我也添加小数据,那么它阻止了UI线程.代码在UI上执行任何任务吗?