Thread.GetNamedDataSlot:用户会话之间的冲突

时间:2018-12-03 10:48:48

标签: c# multithreading asp.net-web-api

Related Q&A(我可以更新该问题,但是内容将完全不同)

HereGetData 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 我可以认为,即使我从其他浏览器尝试设置断点,它也始终使用相同的线程。但是你能帮我诊断出问题吗?

注意:“设置并获取”插槽是当前代码错误的来源,我试图确定确切的问题。我的意图是不要在将来使用线程槽

0 个答案:

没有答案