aliyun-net-credentials/Policy/OneCallerBlocks.cs (37 lines of code) (raw):

using System; using System.Threading; using System.Threading.Tasks; namespace Aliyun.Credentials.Policy { public class OneCallerBlocks : IPrefetchStrategy { private int currentlyRefreshing; public void Prefetch(Action valueUpdater) { if (Interlocked.CompareExchange(ref currentlyRefreshing, 1, 0) != 0) return; try { valueUpdater(); } finally { Interlocked.Exchange(ref currentlyRefreshing, 0); } } public async Task PrefetchAsync(Func<Task> valueUpdater) { if (Interlocked.CompareExchange(ref currentlyRefreshing, 1, 0) != 0) return; try { await valueUpdater.Invoke(); } finally { Interlocked.Exchange(ref currentlyRefreshing, 0); } } public void Dispose() { } } }