它写在docs:
中当线程池重用线程时,它不会清除数据 线程本地存储或用标记的字段 ThreadStaticAttribute属性。因此,当一种方法检查 线程本地存储或用标记的字段 ThreadStaticAttribute属性,它找到的值可能会被保留 从早期使用线程池线程开始。
然而,没有任何关于执行背景的说法。如何检查是否清除了ExecutionContext?
答案 0 :(得分:2)
简而言之 - 是的。
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
未被捕获。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
控制(并且未被清除)。
同样在.NET源代码中,我发现了一个清理,它在项目执行完成后用ExecutionContext
替换为先前的(空的)。