/// <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(); } }