Aetheria/Assets/Scripts/MagicOnion/AsyncLock.cs
hyperion51 a0c8dbee72 Initial Client/Server Communication
#1
Followed the MagicOnion quickstart guide, borrowing code from the chat sample app to get something working
2020-02-26 17:48:40 +00:00

45 lines
1 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
namespace MagicOnion
{
public class AsyncLock
{
readonly SemaphoreSlim semaphore;
#if NON_UNITY
public static readonly ValueTask<LockReleaser> EmptyLock = new ValueTask<LockReleaser>(new LockReleaser(null));
#endif
public AsyncLock()
{
this.semaphore = new SemaphoreSlim(1, 1);
}
#if NON_UNITY
public async ValueTask<LockReleaser> LockAsync()
#else
public async Task<LockReleaser> LockAsync()
#endif
{
await semaphore.WaitAsync().ConfigureAwait(false);
return new LockReleaser(semaphore);
}
public struct LockReleaser : IDisposable
{
readonly SemaphoreSlim semaphore;
public LockReleaser(SemaphoreSlim semaphore)
{
this.semaphore = semaphore;
}
public void Dispose()
{
semaphore?.Release();
}
}
}
}