线程返回线程池后是否清除了ExecutionContext?

时间:2014-07-01 08:11:44

标签: .net threadpool executioncontext

它写在docs

  

当线程池重用线程时,它不会清除数据   线程本地存储或用标记的字段   ThreadStaticAttribute属性。因此,当一种方法检查   线程本地存储或用标记的字段   ThreadStaticAttribute属性,它找到的值可能会被保留   从早期使用线程池线程开始。

然而,没有任何关于执行背景的说法。如何检查是否清除了ExecutionContext?

1 个答案:

答案 0 :(得分:2)

简而言之 - 是的。

  1. New-Item : A positional parameter cannot be found that accepts argument '2) do |config| config.vm.communicator = winrm config.vm.box = Win_10_V.box config.vm.provider virtualbox do |vb| vb.customize [modifyvm, :id, --usb, on] vb.customize [modifyvm, :id, --usbehci, on] vb.customize ['usbfilter', 'add', '0', '--target', :id, '--name', 'SmartCard', '--vendorid', '0x096E', '--productid', '0x0007'] vb.gui = true end end'. At line:1 char:1 + New-Item "D:\VV\Vagrantfile" -type file -force -value "Vagrant.configu ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-Item], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand 未被捕获。
  2. SynchronizationContext已清除。
  3. _

    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控制(并且未被清除)。

    同样在.NET源代码中,我发现了一个清理,它在项目执行完成后用ExecutionContext替换为先前的(空的)。