AsyncLocal never leaks and is safe for CallContext-like state
Even if it's typically used in a static field, the values never leak since they are bound to a transient ExecutionContext
static AsyncLocal<object> local = new AsyncLocal<object>();
async Task Main()
{
WeakReference data = null;
await Task.Run(() =>
{
var o = new object();
data = new WeakReference(o);
// We assign to the static async local, to see if it leaks.
local.Value = o;
});
// After execution is finished, we do have a live reference still.
System.Diagnostics.Debug.Assert(data.IsAlive == true);
GC.Collect();
// But a GC proves nobody is holding a strong reference to it.
System.Diagnostics.Debug.Assert(data.IsAlive == false);
}
Last updated