mirror of https://github.com/abpframework/abp.git
8 changed files with 99 additions and 15 deletions
@ -0,0 +1,89 @@ |
|||
using System; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Volo.Abp.Threading |
|||
{ |
|||
public static class SemaphoreSlimExtensions |
|||
{ |
|||
public static async Task<IDisposable> LockAsync(this SemaphoreSlim semaphoreSlim) |
|||
{ |
|||
await semaphoreSlim.WaitAsync(); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static async Task<IDisposable> LockAsync(this SemaphoreSlim semaphoreSlim, CancellationToken cancellationToken) |
|||
{ |
|||
await semaphoreSlim.WaitAsync(cancellationToken); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static async Task<IDisposable> LockAsync(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout) |
|||
{ |
|||
await semaphoreSlim.WaitAsync(millisecondsTimeout); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static async Task<IDisposable> LockAsync(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout, CancellationToken cancellationToken) |
|||
{ |
|||
await semaphoreSlim.WaitAsync(millisecondsTimeout, cancellationToken); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static async Task<IDisposable> LockAsync(this SemaphoreSlim semaphoreSlim, TimeSpan timeout) |
|||
{ |
|||
await semaphoreSlim.WaitAsync(timeout); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static async Task<IDisposable> LockAsync(this SemaphoreSlim semaphoreSlim, TimeSpan timeout, CancellationToken cancellationToken) |
|||
{ |
|||
await semaphoreSlim.WaitAsync(timeout, cancellationToken); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim) |
|||
{ |
|||
semaphoreSlim.Wait(); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, CancellationToken cancellationToken) |
|||
{ |
|||
semaphoreSlim.Wait(cancellationToken); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout) |
|||
{ |
|||
semaphoreSlim.Wait(millisecondsTimeout); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout, CancellationToken cancellationToken) |
|||
{ |
|||
semaphoreSlim.Wait(millisecondsTimeout, cancellationToken); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, TimeSpan timeout) |
|||
{ |
|||
semaphoreSlim.Wait(timeout); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, TimeSpan timeout, CancellationToken cancellationToken) |
|||
{ |
|||
semaphoreSlim.Wait(timeout, cancellationToken); |
|||
return GetDispose(semaphoreSlim); |
|||
} |
|||
|
|||
private static IDisposable GetDispose(this SemaphoreSlim semaphoreSlim) |
|||
{ |
|||
return new DisposeAction(() => |
|||
{ |
|||
semaphoreSlim.Release(); |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue