public async Task TestDoubleDisposeOnlyPermitsOneTask() { var mutex = new AsyncLock(); var t1HasLock = new TaskCompletionSource <bool>(); var t1Continue = new TaskCompletionSource <bool>(); await Task.Run( async() => { AsyncLock.Releaser key = await mutex.LockAsync(); key.Dispose(); key.Dispose(); }); Task t1 = Task.Run( async() => { using (await mutex.LockAsync()) { t1HasLock.SetResult(true); await t1Continue.Task; } }); await t1HasLock.Task; Task <Task <AsyncLock.Releaser> > task2Start = Task.Factory.StartNew(async() => await mutex.LockAsync()); Task <AsyncLock.Releaser> t2 = await task2Start; Assert.False(t2.IsCompleted); t1Continue.SetResult(true); await t2; await t1; }
protected LanguageKernelTestBase(ITestOutputHelper output) { _lockReleaser = Task.Run(() => _lock.LockAsync()).Result; DisposeAfterTest(output.SubscribeToPocketLogger()); }
internal Releaser(AsyncLock.Releaser releaser) =>
public Releaser(object entry, AsyncLock.Releaser asyncLockReleaser) { _entry = (Entry)entry; _asyncLockReleaser = asyncLockReleaser; }
public async Task AcquireLock() { this.releaser = await this.asyncLock.AcquireAsync(); }