#region /* ----------------------------------------------------------------------- * * * Copyright 2011-2012 GRNET S.A. All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * 1. Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * 2. Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and * documentation are those of the authors and should not be * interpreted as representing official policies, either expressed * or implied, of GRNET S.A. * * ----------------------------------------------------------------------- */ #endregion using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; namespace Pithos.Core { using System; using System.Collections.Generic; using System.Linq; using System.Text; /// /// TODO: Update summary. /// public class JobQueue { private readonly BlockingCollection _statusUpdateQueue = new BlockingCollection(); private CancellationToken _cancellationToken; public void Start(CancellationToken token) { _cancellationToken = token; Task.Factory.StartNew(ProcessUpdates, _cancellationToken); } private void ProcessUpdates() { foreach (var action in _statusUpdateQueue.GetConsumingEnumerable()) { action(); } } public void Add(Action action) { _statusUpdateQueue.Add(action); } public void Stop() { _statusUpdateQueue.CompleteAdding(); } } public class JobAgent:Agent { protected JobAgent(Action> action) :base(action) { } public static JobAgent Create() { return (JobAgent)Start(queue => { Action loop = null; loop = () => { var job = queue.Receive(); job.ContinueWith(t => { t.IgnoreExceptions(); var action = job.Result; action(); queue.DoAsync(loop); }); }; loop(); }); } } }