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,但结果是一样的.
(之前的回复已删除;我认为它可能是一个红色的鲱鱼.)
为了回应有点神秘的评论,你的意思是在第一个请求中你期望得到0,在第二个请求得到1吗?如果是这样,我_ThreadStatic根本看不出这与之相关.我不相信RequestId只会在两个请求之后返回2,即使是在同一个线程上,除非你看到奇怪的调试器效果.如果您认为您看到了一些奇怪的行为,请发布一个简短但完整的程序来证明问题.
请注意,由于您有一个增加计数器的属性,如果您在调试器中单步执行,它可能会在您不期望它时评估该属性 - 即使您没有明确查看该Id属性.这可以解释发生了什么.尝试在不使用调试器的情况下重现问题.
理想情况下,写出幂等属性 - 如果你编写具有副作用的属性,你在调试时总会遇到奇怪的风险,以及代码中的微妙错误(你可能会重构两个属性访问一个,不知道方面效果 - ).