Files
LuaCsForBarotraumaEP/Libraries/BarotraumaLibs/EosInterfacePrivate/InterfaceImpl/Util/CallbackWaiter.cs
2024-03-28 18:34:33 +02:00

51 lines
1.2 KiB
C#

#nullable enable
using System;
using System.Threading.Tasks;
using Barotrauma;
namespace EosInterfacePrivate;
/// <summary>
/// Creates a task that returns the result of a callback.
/// This is meant to be used with EOS' asynchronous methods,
/// which are all callback-based because this is a C library.
/// </summary>
internal class CallbackWaiter<T> where T : notnull
{
private readonly object mutex = new object();
private Option<T> result = Option.None;
private readonly DateTime timeout;
public readonly Task<Option<T>> Task;
public CallbackWaiter(TimeSpan timeout = default)
{
this.timeout = DateTime.Now + (timeout == default
? TimeSpan.FromSeconds(60)
: timeout);
this.Task = System.Threading.Tasks.Task.Run(RunTask);
}
public void OnCompletion(ref T result)
{
lock (mutex)
{
this.result = Option<T>.Some(result);
}
}
private async Task<Option<T>> RunTask()
{
while (DateTime.Now < timeout)
{
lock (mutex)
{
if (result.IsSome()) { return result; }
}
await System.Threading.Tasks.Task.Delay(32);
}
return Option.None;
}
}