using System; using System.Threading.Tasks; using System.Threading.Channels; using Exceptionless; using Exceptionless.Models; namespace Sledgemapper { public class ChannelsQueue { private readonly ChannelWriter _writer; public ChannelsQueue() { var channel = Channel.CreateUnbounded(new UnboundedChannelOptions() { SingleReader = true }); var reader = channel.Reader; _writer = channel.Writer; Task.Run(async () => { while (await reader.WaitToReadAsync()) { // Fast loop around available jobs while (reader.TryRead(out var job)) { try { job.Invoke(); } catch (Exception ex) { ExceptionlessClient.Default.SubmitException(ex); throw; } } } }); } public void Enqueue(Action job) { _writer.TryWrite(job); } public void Stop() { _writer.Complete(); } } }