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);
        }
示例#4
0
        /// <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");
        }
示例#6
0
        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));
        }
示例#8
0
 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);
        }
示例#10
0
        /// <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);
        }
示例#11
0
 /// <summary>
 /// Ends the TraceContext scope.
 /// </summary>
 private void End()
 {
     AsyncLocalContext.SetData(_slot, _baseContext);
 }