Caching a value just once and update it without blocking other threads
The initial creation looks thread-safe at first glance. I don't know why you await your semaphore instead of just waiting synchronously with _ss.Wait(0) but I don't think it matters much.

The updating part however is not thread-safe. Any number of threads can come in between:


if (!_isUpdating &amp;&amp; _isRenewNeeded(_container.Value))



and


_isUpdating = true;



This will result in every thread getting their own value, which is probably not what you want.

You should also call Dispose on disposable objects when you no longer need them.