mirror of
https://github.com/stride3d/stride.git
synced 2026-10-12 02:23:23 +00:00
* [Core.Mathematics] Modernize code * [Core.Mathematics] Add tests to Stride.Tests.Simple * [Core] Cleanup some code * [Core.CompilerServices] Cleanup some code * [Core.CompilerServices] Add tests to Stride.Tests.Simple * [Core.IO] Modernize code * [Core.MicroThreading] Modernize code * [Core.Serialization] Modernize code * [Core.AssemblyProcessor.Tests] Modernize code * [Core.CompilerServices.Tests] Modernize code * [Core.Mathematics.Tests] Modernize code * [Core.Tests] Modernize code * [Core.Translation] Modernize code * [Core.Reflection] Modernize code * Fixes build of Stride.VisualStudio.sln * [Core.Yaml.Tests] Modernize code * [Core.Design] Modernize code * [Core.Design.Tests] Modernize code * [Core.Mathematics] More annotations * Fix build of projects that import code from Core.Design Especially those targeting .NET Framework
44 lines
1.2 KiB
C#
44 lines
1.2 KiB
C#
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
|
|
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
|
|
|
|
namespace Stride.Core.MicroThreading;
|
|
|
|
public class AsyncAutoResetEvent
|
|
{
|
|
// Credit: http://blogs.msdn.com/b/pfxteam/archive/2012/02/11/10266923.aspx
|
|
private readonly Queue<TaskCompletionSource<bool>> waits = [];
|
|
private bool signaled;
|
|
|
|
public Task WaitAsync()
|
|
{
|
|
lock (waits)
|
|
{
|
|
if (signaled)
|
|
{
|
|
signaled = false;
|
|
return Task.CompletedTask;
|
|
}
|
|
else
|
|
{
|
|
var tcs = new TaskCompletionSource<bool>();
|
|
waits.Enqueue(tcs);
|
|
return tcs.Task;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Set()
|
|
{
|
|
TaskCompletionSource<bool>? toRelease = null;
|
|
lock (waits)
|
|
{
|
|
if (waits.Count > 0)
|
|
toRelease = waits.Dequeue();
|
|
else if (!signaled)
|
|
signaled = true;
|
|
}
|
|
|
|
toRelease?.SetResult(true);
|
|
}
|
|
}
|