title: Windows Phone - using mutex for Isolated Storage
body: <p>I am trying to secure my isolated storage with mutex so I can access it from both mobile application and <code>BackgroundAudioPlayer</code>.</p>
  
  <p>These are my helpers class to access files in isostorage:</p>
  
  <pre><code>    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&lt;string&gt; 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;
          }
      }
  </code></pre>
  
  <p>But when I try to access it in Background Agent I get this error:</p>
  
  <pre><code> Object synchronization method was called from an unsynchronized block of code.
  </code></pre>
  
  <p>StackTrace:</p>
  
  <pre><code>   at System.Threading.Mutex.ReleaseMutex()
     at YouRadio.IsolatedStorage.StorageHelpers.&lt;ReadFile&gt;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.&lt;AddTracksFromIsoStorageToPlaylist&gt;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.&lt;OnUserAction&gt;d__2.MoveNext()
  </code></pre>
  
  <p>What I am doing wrong?</p>