using System;
using System.Threading;
using Robust.Shared.Exceptions;
using Robust.Shared.IoC;
namespace Robust.Shared.Asynchronous
{
internal sealed class TaskManager : ITaskManager
{
private RobustSynchronizationContext _mainThreadContext = default!;
[Dependency] private readonly IRuntimeLog _runtimeLog = default!;
public void Initialize()
{
_mainThreadContext = new RobustSynchronizationContext(_runtimeLog);
SynchronizationContext.SetSynchronizationContext(_mainThreadContext);
}
public void ProcessPendingTasks()
{
_mainThreadContext.ProcessPendingTasks();
}
public void RunOnMainThread(Action callback)
{
_mainThreadContext.Post(_runCallback, callback);
}
private static readonly SendOrPostCallback _runCallback = o =>
{
((Action?)o)?.Invoke();
};
}
public interface ITaskManager
{
void Initialize();
void ProcessPendingTasks();
///
/// Run a delegate on the main thread sometime later.
/// Thread safe.
///
///
/// Useful if you want to run a callback from a separate thread.
///
/// The callback that will be invoked on the main thread.
void RunOnMainThread(Action callback);
}
}