mirror of
https://github.com/actions/runner.git
synced 2026-07-14 02:22:05 +08:00
34 lines
999 B
C#
34 lines
999 B
C#
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace GitHub.Runner.Common
|
|
{
|
|
//Stephen Toub: http://blogs.msdn.com/b/pfxteam/archive/2012/02/11/10266920.aspx
|
|
|
|
public class AsyncManualResetEvent
|
|
{
|
|
private volatile TaskCompletionSource<bool> m_tcs = new TaskCompletionSource<bool>();
|
|
|
|
public Task WaitAsync() { return m_tcs.Task; }
|
|
|
|
public void Set()
|
|
{
|
|
var tcs = m_tcs;
|
|
Task.Factory.StartNew(s => ((TaskCompletionSource<bool>)s).TrySetResult(true),
|
|
tcs, CancellationToken.None, TaskCreationOptions.PreferFairness, TaskScheduler.Default);
|
|
tcs.Task.Wait();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
while (true)
|
|
{
|
|
var tcs = m_tcs;
|
|
if (!tcs.Task.IsCompleted ||
|
|
Interlocked.CompareExchange(ref m_tcs, new TaskCompletionSource<bool>(), tcs) == tcs)
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|