You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.0 KiB
38 lines
1.0 KiB
using System; |
|
using System.Threading; |
|
using System.Threading.Tasks; |
|
|
|
namespace Server.Utils; |
|
|
|
// Inspired from: https://stackoverflow.com/a/57517920 |
|
public class AsyncThrottle { |
|
private readonly SemaphoreSlim openConnectionSemaphore; |
|
|
|
public AsyncThrottle(int limit) { |
|
openConnectionSemaphore = new(limit, limit); |
|
} |
|
|
|
public async Task<T> MakeRequest<T>(Task<T> task) => await MakeRequest(() => task); |
|
public async Task<T> MakeRequest<T>(Func<Task<T>> taskCreator) { |
|
await openConnectionSemaphore.WaitAsync(); |
|
try { |
|
var result = await taskCreator(); |
|
return result; |
|
} |
|
finally { |
|
openConnectionSemaphore.Release(); |
|
} |
|
} |
|
|
|
|
|
public async Task MakeRequest(Task task) => await MakeRequest(() => task); |
|
public async Task MakeRequest(Func<Task> taskCreator) { |
|
await openConnectionSemaphore.WaitAsync(); |
|
try { |
|
await taskCreator(); |
|
} |
|
finally { |
|
openConnectionSemaphore.Release(); |
|
} |
|
} |
|
} |