// *******************************************************************************
//
// ******* *** *** *
// * * * *
// * * * *****
// * * *** * * ** * ** ***
// * * * * * * * **** * * *
// * * * * * * * * * * *
// * *** *** * ** ** ** * *
// *
// *******************************************************************************
// see https://github.com/tgoessler/TCSystemCS for details.
// Copyright (C) 2003 - 2026 Thomas Goessler. All Rights Reserved.
// *******************************************************************************
//
// TCSystem is the legal property of its developers.
// Please refer to the COPYRIGHT file distributed with this source distribution.
//
// *******************************************************************************
#region Usings
using System.Threading;
using System.Threading.Tasks;
#endregion
namespace TCSystem.Thread;
internal sealed class AsyncUpdateHelper : IAsyncUpdateHelper
{
#region Public
public async Task BeginUpdateAsync()
{
Interlocked.Increment(ref _numPendingStops);
Interlocked.Increment(ref _numPendingUpdates);
await _semaphore.WaitAsync();
Interlocked.Decrement(ref _numPendingStops);
Interlocked.Decrement(ref _numPendingUpdates);
}
public async Task WaitAsync()
{
Interlocked.Increment(ref _numPendingUpdates);
await _semaphore.WaitAsync();
Interlocked.Decrement(ref _numPendingUpdates);
}
public void EndUpdate()
{
_semaphore.Release();
}
public bool ShouldStop => Interlocked.Read(ref _numPendingStops) > 0;
public bool IsUpdatePending => Interlocked.Read(ref _numPendingUpdates) > 0;
#endregion
#region Private
private long _numPendingStops;
private long _numPendingUpdates;
private readonly SemaphoreSlim _semaphore = new(1, 1);
#endregion
}