1
0
mirror of https://github.com/chylex/Minecraft-Phantom-Panel.git synced 2025-10-29 04:24:21 +01:00
Files
.config
.run
.workdir
Agent
Common
Controller
Docker
Utils
Phantom.Utils
Collections
Cryptography
IO
Processes
Runtime
Tasks
Threading
ThreadSafeLinkedList.cs
ThreadSafeStructRef.cs
WaitHandleExtensions.cs
Phantom.Utils.csproj
Phantom.Utils.Events
Phantom.Utils.Logging
Phantom.Utils.Rpc
Phantom.Utils.Tests
Web
.dockerignore
.gitattributes
.gitignore
AddMigration.bat
AddMigration.sh
Directory.Build.props
Directory.Build.targets
Dockerfile
LICENSE
Packages.props
PhantomPanel.sln
README.md
global.json
Minecraft-Phantom-Panel/Utils/Phantom.Utils/Threading/WaitHandleExtensions.cs
2023-04-07 01:33:13 +02:00

28 lines
875 B
C#

namespace Phantom.Utils.Threading;
public static class WaitHandleExtensions {
public static Task WaitOneAsync(this WaitHandle waitHandle, CancellationToken cancellationToken = default) {
var taskCompletionSource = new TaskCompletionSource();
void SetResult(object? state, bool timedOut) {
taskCompletionSource.TrySetResult();
}
void SetCancelled() {
taskCompletionSource.TrySetCanceled(cancellationToken);
}
var waitRegistration = ThreadPool.RegisterWaitForSingleObject(waitHandle, SetResult, null, Timeout.InfiniteTimeSpan, true);
var tokenRegistration = cancellationToken.Register(SetCancelled, useSynchronizationContext: false);
void Cleanup(Task t) {
waitRegistration.Unregister(null);
tokenRegistration.Dispose();
}
var task = taskCompletionSource.Task;
task.ContinueWith(Cleanup, CancellationToken.None);
return task;
}
}