c# – Windows Phone – 使用互斥锁进行隔离存储
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Windows Phone – 使用互斥锁进行隔离存储,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3188字,纯文字阅读大概需要5分钟。
内容图文
我试图用互斥锁保护我的隔离存储,以便我可以从移动应用程序和BackgroundAudioPlayer访问它.
这些是我在isosorage中访问文件的助手类:
public static async Task WriteToFile(string text)
{
using (var mut = new Mutex(false, "IsoStorageMutex"))
{
mut.WaitOne();
try
{
// Get the text data from the textbox.
byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(text.ToCharArray());
// Get the local folder.
var local = ApplicationData.Current.LocalFolder;
// Create a new folder name DataFolder.
var dataFolder = await local.CreateFolderAsync("MusicFolder",
CreationCollisionOption.OpenIfExists);
// Create a new file named DataFile.txt.
var file = await dataFolder.CreateFileAsync("Streams.txt",
CreationCollisionOption.ReplaceExisting);
// Write the data from the textbox.
using (var s = await file.OpenStreamForWriteAsync())
{
s.Write(fileBytes, 0, fileBytes.Length);
}
}
finally
{
mut.ReleaseMutex();
}
}
}
public static async Task<string> ReadFile()
{
using (var mut = new Mutex(false, "IsoStorageMutex"))
{
mut.WaitOne();
var result = String.Empty;
try
{
// Get the local folder.
var local = ApplicationData.Current.LocalFolder;
if (local != null)
{
// Get the DataFolder folder.
var dataFolder = await local.GetFolderAsync("MusicFolder");
// Get the file.
var file = await dataFolder.OpenStreamForReadAsync("Streams.txt");
// Read the data.
using (var streamReader = new StreamReader(file))
{
result = streamReader.ReadToEnd();
}
}
}
finally
{
mut.ReleaseMutex();
}
return result;
}
}
但是当我尝试在后台代理中访问它时,我收到此错误:
Object synchronization method was called from an unsynchronized block of code.
堆栈跟踪:
at System.Threading.Mutex.ReleaseMutex()
at YouRadio.IsolatedStorage.StorageHelpers.<ReadFile>d__b.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at YouRadio.AudioPlaybackAgent.AudioPlayer.<AddTracksFromIsoStorageToPlaylist>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at YouRadio.AudioPlaybackAgent.AudioPlayer.<OnUserAction>d__2.MoveNext()
我做错了什么?
解决方法:
你正在以错误的方式实现Mutex.您应该在IsolatedStorageHelper类中创建它的全局实例,并使用该实例创建方法.
public class IsolatedStorageHelper
{
private static Mutex mut = new Mutex(false, "IsoStorageMutex");
public static async Task WriteToFile(string text)
{
mut.WaitOne();
try
{
...
}
finally
{
mut.ReleaseMutex();
}
}
public static async Task<string> ReadFile()
{
mut.WaitOne();
var result = String.Empty;
try
{
...
}
finally
{
mut.ReleaseMutex();
}
return result;
}
}
互斥锁具有线程关联性,互斥锁的所有者是线程.获取它的线程也必须是调用ReleaseMutex()的线程.打破这使得这个令人讨厌的异常被抛出.
根据您的要求,您可能还有不同的互斥锁用于读写文件.此外,如果所有方法在您的类中都是静态的,您可以将它设为单例类.这样你就可以有一个私有构造函数来初始化互斥和其他东西.
内容总结
以上是互联网集市为您收集整理的c# – Windows Phone – 使用互斥锁进行隔离存储全部内容,希望文章能够帮你解决c# – Windows Phone – 使用互斥锁进行隔离存储所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。