// ----------------------------------------------------------------------- // // TODO: Update copyright text. // // ----------------------------------------------------------------------- using System.Threading.Tasks; namespace Pithos.Core.Agents { using System; using System.Collections.Generic; using System.Linq; using System.Text; /// /// TODO: Update summary. /// public class AsyncAutoResetEvent { private readonly static Task Completed = TaskEx.FromResult(true); private readonly Queue> _waits = new Queue>(); private bool _signaled; public Task WaitAsync() { lock (_waits) { if (_signaled) { _signaled = false; return Completed; } else { var tcs = new TaskCompletionSource(); _waits.Enqueue(tcs); return tcs.Task; } } } public void Set() { TaskCompletionSource toRelease = null; lock (_waits) { if (_waits.Count > 0) toRelease = _waits.Dequeue(); else if (!_signaled) _signaled = true; } if (toRelease != null) toRelease.SetResult(true); } } }