private async Task Inner(AsyncLocalContext <Guid> ctx, Guid expected) { Assert.That(ctx.Value, Is.EqualTo(expected), "Inner pre"); await Task.Delay(1000); Assert.That(ctx.Value, Is.EqualTo(expected), "Inner post"); }
public void It_should_set_and_get_value() { var ctx = new AsyncLocalContext <object>(); var expected = new object(); ctx.Value = expected; Assert.That(ctx.Value, Is.SameAs(expected)); }
public async Task Async_tasks_should_share_the_context() { var ctx = new AsyncLocalContext <Guid>(); var task1 = Outer(ctx, Guid.NewGuid()); var task2 = Outer(ctx, Guid.NewGuid()); var task3 = Outer(ctx, Guid.NewGuid()); await Task.WhenAll(task1, task2, task3); }
/// <summary> /// Gets a value associated with the given key in the current scope. /// </summary> /// <param name="key">The key to look up.</param> /// <returns>The value associated with the key, or null of the value was not set.</returns> public static object GetValue(string key) { var data = (TraceContext)AsyncLocalContext.GetData(_slot); if (data == null) { return(null); } return(data[key]); }
private async Task Outer(AsyncLocalContext <Guid> ctx, Guid expected) { ctx.Value = expected; await Task.Yield(); Assert.That(ctx.Value, Is.EqualTo(expected), "Outer pre"); await Task.Delay(1000); await Task.WhenAll(Inner(ctx, expected), Inner(ctx, expected), Inner(ctx, expected)); Assert.That(ctx.Value, Is.EqualTo(expected), "Outer post"); }
private static Guid GetActivityId() { // if we have stored a guid, then return that var data = AsyncLocalContext.GetData(_slot); if (data != null) { return((Guid)data); } return(Guid.Empty); }
public async Task Async_tasks_should_not_interfere_each_other() { var ctx = new AsyncLocalContext <object>(); Func <object, Task> func = async expected => { ctx.Value = expected; await Task.Delay(500); Assert.That(ctx.Value, Is.EqualTo(expected)); }; await Task.WhenAll(func(new object()), func(new object()), func(null)); }
private static void SetActivityId(Guid activityId) { // never store the empty guid, just convert it to null and revert to the system activity ID if (activityId == Guid.Empty) { AsyncLocalContext.SetData(_slot, null); UnsafeNativeMethods.SetActivityId(Trace.CorrelationManager.ActivityId); } else { AsyncLocalContext.SetData(_slot, activityId); UnsafeNativeMethods.SetActivityId(activityId); } }
public void It_should_allow_to_override_value() { var ctx = new AsyncLocalContext <object>(); var expected = new object(); var expected2 = new object(); ctx.Value = expected; Assert.That(ctx.Value, Is.SameAs(expected)); ctx.Value = expected2; Assert.That(ctx.Value, Is.SameAs(expected2)); ctx.Value = null; Assert.That(ctx.Value, Is.Null); }
/// <summary> /// Starts a new TraceContext scope. /// </summary> /// <returns>The new TraceContext that can be filled in.</returns> public static TraceContext Begin() { var data = (TraceContext)AsyncLocalContext.GetData(_slot); TraceContext context = null; try { context = new TraceContext(data); AsyncLocalContext.SetData(_slot, context); } catch { context.Dispose(); throw; } return(context); }
/// <summary> /// Ends the TraceContext scope. /// </summary> private void End() { AsyncLocalContext.SetData(_slot, _baseContext); }