Related Q&A(我可以更新该问题,但是内容将完全不同)
Here在GetData and SetData
下,它被暗示:
第三种方法是在Thread类中使用两种方法:GetData 和SetData。这些将数据存储在特定于线程的“插槽”中。 Thread.GetData从线程的隔离数据存储中读取; Thread.SetData写入它。两种方法都需要LocalDataStoreSlot 识别插槽的对象。同一插槽可用于所有 线程,它们仍将获得单独的值
和
在这种情况下,我们称为Thread.GetNamedDataSlot,它创建了一个 命名插槽-允许在应用程序中共享该插槽。
问题1 ,请让我了解它是否有效:“数据槽中的数据已保存,用于.net mvc Web api调用的交叉线程。”
根据我在简单的Web api应用程序中的实验:
public class ValuesController : ApiController
{
public IEnumerable<string> Get()
{
var res1 = System.Threading.Thread.GetData(System.Threading.Thread.GetNamedDataSlot("authHeader"));
if (res1 == null)
System.Threading.Thread.SetData(System.Threading.Thread.GetNamedDataSlot("authHeader"), new Random().var
res2 = Thread.GetData(System.Threading.Thread.GetNamedDataSlot("authHeader"));
return new string[] { "value1", "value2", res2?.ToString() };
}
}
1-如果设置了断点
{if (res1 == null)
首次调用会生成随机数,而对于后续调用res1 == null
始终为false,这意味着res1
有值并且仅会生成一次随机数。
2-如果我没有设置断点
在运行模式下,它会随机提供以下输出之一,并随机重复,即是说64853109出现了不止一次
<ArrayOfstring>
<string>value1</string>
<string>value2</string>
<string>64853109</string>
</ArrayOfstring>
<ArrayOfstring>
<string>value1</string>
<string>value2</string>
<string>1174687568</string>
</ArrayOfstring>
<ArrayOfstring>
<string>value1</string>
<string>value2</string>
<string>1367595402</string>
</ArrayOfstring>
<ArrayOfstring>
<string>value1</string>
<string>value2</string>
<string>1303501153</string>
</ArrayOfstring>
问题2 我可以认为,即使我从其他浏览器尝试设置断点,它也始终使用相同的线程。但是你能帮我诊断出问题吗?
注意:“设置并获取”插槽是当前代码错误的来源,我试图确定确切的问题。我的意图是不要在将来使用线程槽