Instantly share code, notes, and snippets.

Embed
What would you like to do?
Sequencer 2.0 alpha
using System;
using System.Collections.Generic;
using System.Threading;
namespace Sequencer
{
public class Sequencer
{
private Queue<Action> _pendingTasks = new Queue<Action>();
private bool _isRunning;
private readonly object _lock = new Object();
public void Dispatch(Action action)
{
lock(_lock) {
// we need to store
_pendingTasks.Enqueue(action);
}
// here we queue a call to our own logic
ThreadPool.QueueUserWorkItem( (x)=> Run((Action) x), action );
}
// run when the pool has available cpu time for us.
private void Run(Action action)
{
lock(_lock) {
if (_isRunning) {
// we need to stop
return;
}
// ok, we can run
_isRunning = true;
}
while (true) {
// execute the next action
action ();
// we check if others are available
lock (_lock) {
if (_pendingTasks.Count == 0) {
_isRunning = false;
return;
}
// pop the next task
action = _pendingTasks.Dequeue();
}
}
}
}
}
@valerysntx

This comment has been minimized.

valerysntx commented May 15, 2016

Does sequencer is trying to address the producer-consumer problem?
https://gist.github.com/valerysntx/1cb73ae17e71b8123b1cd4d4dd18c9d8#file-producerconsumerqueue-cs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment