/// <summary>
 /// Tries to enqueue the given async write and callback
 /// </summary>
 /// <param name="w"></param>
 /// <param name="writerDelegate"></param>
 /// <returns></returns>
 public AsyncQueueResult Queue(AsyncWrite w, Func <AsyncWrite, Task> writerDelegate)
 {
     lock (sync)
     {
         if (queuedBytes < 0)
         {
             throw new InvalidOperationException();
         }
         if (queuedBytes + w.GetEntrySizeInMemory() > MaxQueueBytes)
         {
             return(AsyncQueueResult.QueueFull);                                                        //Because we would use too much ram.
         }
         if (c.ContainsKey(w.Key))
         {
             return(AsyncQueueResult.AlreadyPresent);                      //We already have a queued write for this data.
         }
         c.Add(w.Key, w);
         queuedBytes  += w.GetEntrySizeInMemory();
         w.RunningTask = Task.Run(
             async() => {
             try
             {
                 await writerDelegate(w);
             }
             finally
             {
                 Remove(w);
             }
         });
         return(AsyncQueueResult.Enqueued);
     }
 }
 /// <summary>
 /// Removes the specified object based on its relativePath and modifiedDateUtc values.
 /// </summary>
 /// <param name="w"></param>
 private void Remove(AsyncWrite w)
 {
     lock (sync)
     {
         c.Remove(w.Key);
         queuedBytes -= w.GetEntrySizeInMemory();
     }
 }