|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
namespace Microsoft.Extensions.Internal;
public class NonCapturingTimerTest
{
[Fact]
public async Task NonCapturingTimer_DoesntCaptureExecutionContext()
{
// Arrange
var message = new AsyncLocal<string>();
message.Value = "Hey, this is a value stored in the execuion context";
var tcs = new TaskCompletionSource<string>();
// Act
var timer = NonCapturingTimer.Create((_) =>
{
// Observe the value based on the current execution context
tcs.SetResult(message.Value);
}, state: null, dueTime: TimeSpan.FromMilliseconds(1), Timeout.InfiniteTimeSpan);
// Assert
var messageFromTimer = await tcs.Task;
timer.Dispose();
// ExecutionContext didn't flow to timer callback
Assert.Null(messageFromTimer);
// ExecutionContext was restored
Assert.NotNull(await Task.Run(() => message.Value));
}
}
|