ThreadStatic的奇怪行为

INs*_*INs -2 .net c# multithreading

我有代码:

internal static class IdCounter
{
    [ThreadStatic]
    private static int _id = 0;

    static IdCounter()
    {

    }

    public static int Id
    {
        get
        {
            lock(typeof(IdCounter))
            {
                return _id++;
            }
        }
    }
}

public abstract class Request
{
    protected Request(int requestId)
    {
        RequestId = IdCounter.Id;
    }
}
Run Code Online (Sandbox Code Playgroud)

在第二次调用时,我收到RequestId等于2,而不是1,问题出在哪里?我试图使用Thread.SetData,但结果是一样的.

Jon*_*eet 5

(之前的回复已删除;我认为它可能是一个红色的鲱鱼.)

为了回应有点神秘的评论,你的意思是在第一个请求中你期望得到0,在第二个请求得到1吗?如果是这样,我_ThreadStatic根本看不出这与之相关.我不相信RequestId只会在两个请求之后返回2,即使是在同一个线程上,除非你看到奇怪的调试器效果.如果您认为您看到了一些奇怪的行为,请发布一个简短但完整的程序来证明问题.

请注意,由于您有一个增加计数器的属性,如果您在调试器中单步执行,它可能会在您不期望它时评估该属性 - 即使您没有明确查看该Id属性.这可以解释发生了什么.尝试在使用调试器的情况下重现问题.

理想情况下,写出幂等属性 - 如果你编写具有副作用的属性,你在调试时总会遇到奇怪的风险,以及代码中的微妙错误(你可能会重构两个属性访问一个,不知道方面效果 - ).

  • @INs:嗯,想要更隐秘吗?如果您在询问问题并回答答案时不清楚,则需要更长的时间来帮助您. (2认同)