9

我在以下代码中遇到上述异常和错误,该代码旨在播放来自独立存储的选定 mp3 文件:

using (var isf = IsolatedStorageFile.GetUserStoreForApplication())
{            
     using (var isfs = isf.OpenFile(selected.Path, FileMode.Open))
     {                        
          this.media.SetSource(isfs);              
          isfs.Close();                        
     }                    
     isf.Dispose();
}

该错误是如此模糊,以至于我不确定可能出了什么问题...我可以检查的任何想法或至少是该错误的常见来源?

编辑:异常被抛出:using(var isfs = isf.OpenFile(...))

编辑2:堆栈跟踪...

at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, IsolatedStorageFile isf)
at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, IsolatedStorageFile isf)
at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, IsolatedStorageFile isf)
at Ringify.Phone.PivotContent.RingtoneCollectionPage.MediaIconSelected(Object sender, GestureEventArgs e)
at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)

我也意识到,如果我播放一首歌曲然后停止它(用户界面中有一个播放和暂停按钮),然后播放另一首歌曲,则不会发生错误。当我播放一首歌曲,停止它并尝试再次播放同一首歌曲时,就会发生这种情况。

4

2 回答 2

8

当您播放相同的音乐两次时会出现此问题,因此可能是文件共享问题。您应该尝试提供该OpenFile方法的 FileShare 参数:

var isfs = isf.OpenFile(selected.Path, FileMode.Open, FileShare.Read)

虽然我不明白为什么会发生这种情况,因为您明确关闭了文件。

编辑:好的,用反射器做了一些挖掘,我想通了。MediaElement.SetSource 的代码是:

public void SetSource(Stream stream)
{
    if (stream == null)
    {
        throw new ArgumentNullException("stream");
    }
    if (stream.GetType() != typeof(IsolatedStorageFileStream))
    {
        throw new NotSupportedException("Stream must be of type IsolatedStorageFileStream");
    }
    IsolatedStorageFileStream stream2 = stream as IsolatedStorageFileStream;
    stream2.Flush();
    stream2.Close();
    this.Source = new Uri(stream2.Name, UriKind.Absolute);
}

所以基本上它不使用你提供的流,甚至关闭它。但它保留了文件的名称,我猜它会在你播放音乐时重新打开它。因此,如果您在播放音乐时尝试以独占访问权限重新打开同一文件,则会失败,因为 MediaElement 已打开该文件。棘手。

于 2012-05-01T21:43:08.590 回答
1

我相信您应该使用IsolatedStorageFileStream

using (var isf = IsolatedStorageFile.GetUserStoreForApplication())
{            
     using (var isfs = new IsolatedStorageFileStream(selected.Path, FileMode.Open, isf))
     {                        
          this.media.SetSource(isfs);              
     }                    
}

另外,请注意,您不需要调用.Close()or.Dispose()方法,因为它们在 using 语句中得到处理。

于 2012-05-01T20:59:21.603 回答