它写在文档中:
线程池重用线程时,不会清除线程本地存储中的数据,也不会清除带有 ThreadStaticAttribute 属性标记的字段中的数据。因此,当一个方法检查线程本地存储或标记有 ThreadStaticAttribute 属性的字段时,它找到的值可能是线程池线程的早期使用遗留下来的。
然而,它对执行上下文只字未提。如何检查 ExecutionContext 是否被清除?
它写在文档中:
线程池重用线程时,不会清除线程本地存储中的数据,也不会清除带有 ThreadStaticAttribute 属性标记的字段中的数据。因此,当一个方法检查线程本地存储或标记有 ThreadStaticAttribute 属性的字段时,它找到的值可能是线程池线程的早期使用遗留下来的。
然而,它对执行上下文只字未提。如何检查 ExecutionContext 是否被清除?
简而言之 - 是的。
SynchronizationContext
没有被捕获。LogicalCallContext
被清除。_
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Threading;
using System.Threading.Tasks;
using NUnit.Framework;
namespace Tests
{
[TestFixture]
public class ExecutionContextFlowTest
{
[Test]
public async Task Execute()
{
try
{
ThreadPool.SetMinThreads(2, 100);
ThreadPool.SetMaxThreads(2, 100);
var asyncLocal = new AsyncLocal<bool>();
await Task.Run(
() =>
{
asyncLocal.Value = true;
CallContext.LogicalSetData("test", true);
});
await Task.WhenAll(
Enumerable.Range(0, 10).Select(
_ => Task.Run(
() =>
{
Assert.That(asyncLocal.Value, Is.False);
Assert.That(CallContext.LogicalGetData("test"), Is.Null);
})).ToArray());
}
finally
{
ThreadPool.SetMinThreads(10, 100);
ThreadPool.SetMaxThreads(100, 100);
}
}
}
}
虽然我不确定SecurityContext
.
[ThreadStatic]
并且ThreadLocal
不受控制ExecutionContext
(也未清除)。
同样在 .NET 源代码中,我发现ExecutionContext
在项目执行完成后替换为以前的(空)的清理。