2013-09-30 120 views
5

[编辑:我意识到,失败的参数实际上是一个双精度,而不是整数。根据日志,整数定时器都不会失败。大多数定时器和参数都是整数,但不是全部。双打并不是原子,毕竟缺少锁定可能是问题。]为什么整数属性有时会返回0?

我有一个应用程序使用包含可配置值的属性的类。大多数在应用程序中使用的属性都是派生的。这些值在启动时设置,在应用程序的主要部分运行时不会更改。

private int _TimerInterval; 
public int TimerInterval { get { return _TimerInterval; } } 

private int _Factor1; 
public int Factor1 { 
    set { 
    _Factor1 = value; 
    _TimerInterval = _Factor1 * _Factor2; 
    } 
    get { return _Factor1; } 
} 

private int _Factor2; 
public int Factor2 { 
    set { 
    _Factor2 = value; 
    _TimerInterval = _Factor1 * _Factor2; 
    } 
    get { return _Factor2; } 
} 

我发现很少返回的值显然为零,​​因为有一个例外。

Exception Message: '0' is not a valid value for 'Interval'. 'Interval' must be greater than 0. 
Exception Target Site: set_Interval 

调用代码看起来石灰这样的:

exitTimer.Interval = _config.TimerInterval; 

程序是多线程的,但调用个人财产只在一个线程中使用。该类的其他属性在其他线程中调用。我确实在其他具有类似属性的定时器上看到了这个问题。

如果我捕获异常并重试它的工作分配。

在我的计时器中会发生什么事情会导致执行除了属性返回零?被要求更多代码

每个字段被定义为一个cfXXX(配置域)恒定 -

更新#1。这确保我们不会拼错字段名称。每个属性的相应默认值定义为DefXXXPareseXXX函数(本示例中的ParseInt)接受配置查找中的字符串值,并将其转换为相应的值类型或提供的默认值(如果失败)。失败将来自缺少的XML记录(新配置选项)或错误编辑的记录。

代码来加载初始配置数据:

// Main Form 
public fMain() 
{ 
    InitializeComponent(); 
    config = new ConfigData(); 
    config.LoadConfig(); 
    // Other initializations 
} 

//ConfigData Class 

// XML config field names 
private const string cfFactor1 = "Factor1"; 
private const string cfFactor1 = "Factor2"; 
private const string cfFactor3 = "Factor3"; 
private const string cfFactor4 = "Factor4"; 

//Default values 
private const int DefFactor1 = 1; 
private const int DefFactor2 = 50; 
private const int DefFactor3 = 1; 
private const int DefFactor4 = 25; 

public void LoadConfig() 
{ 
    Factor1 = ParseInt(ConfigurationManager.AppSettings[cfFactor1], DefFactor1); 
    Factor2 = ParseInt(ConfigurationManager.AppSettings[cfFactor2], DefFactor2); 
    Factor3 = ParseInt(ConfigurationManager.AppSettings[cfFactor3], DefFactor3); 
    Factor4 = ParseInt(ConfigurationManager.AppSettings[cfFactor4], DefFactor4); 
} 

int ParseInt(string numberString, int aDefault = 0) 
{ 
    int result; 
    if (!int.TryParse(numberString, out result)) { 
    result = aDefault; 
    } 
    return result; 
} 
+1

你怎么设置Factor1和Factor2? –

+9

“程序是多线程的......”< - 那是你的问题。 –

+4

显然,_config.TimerInterval属性为0.这是*线程竞争*的典型标志,允许线程在* _config完全初始化之前启动*。当然,这可能意味着你的配置不好或丢失。 –

回答

2

问题是前提错了。失败的属性实际上是浮动的,而不是整数。尴尬。正如所料,为这些项目添加锁定属性可以解决问题。整数定时器永远不会失败。

我刚刚删除了这个问题,但它已经有答案。所以让它成为双重检查假设的教训。

+0

+1用于确认所需的修复程序和您学到的内容。至少对我有用的反馈。 – groverboy

0

_TimerInterval为0时被设定只是因子1或因子2。

X * 0 = 0

+0

是的,但在这种情况下不是。 –

+0

您的LoadConfig函数刚刚设置Factor1 – user743414

+0

是的,它确实 - 当我简化名称时剪切并粘贴错字。抱歉。 –

1

如果你想分配这些因素,一次为每个实例,使用实例之前......这样做,在一个构造函数。

如果你想为这个类型分配一次这些因子,在创建任何实例之前......在一个静态构造函数中做。

不要在线程之间共享可变实例。

相关问题