3

它写在文档中:

线程池重用线程时,不会清除线程本地存储中的数据,也不会清除带有 ThreadStaticAttribute 属性标记的字段中的数据。因此,当一个方法检查线程本地存储或标记有 ThreadStaticAttribute 属性的字段时,它找到的值可能是线程池线程的早期使用遗留下来的。

然而,它对执行上下文只字未提。如何检查 ExecutionContext 是否被清除?

4

1 回答 1

2

简而言之 - 是的。

  1. SynchronizationContext没有被捕获。
  2. 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在项目执行完成后替换为以前的(空)的清理。

于 2016-09-06T10:11:54.837 回答