[编辑:我意识到,失败的参数实际上是一个双精度,而不是整数。根据日志,整数定时器都不会失败。大多数定时器和参数都是整数,但不是全部。双打并不是原子,毕竟缺少锁定可能是问题。]为什么整数属性有时会返回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。这确保我们不会拼错字段名称。每个属性的相应默认值定义为DefXXX
。 PareseXXX
函数(本示例中的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;
}
你怎么设置Factor1和Factor2? –
“程序是多线程的......”< - 那是你的问题。 –
显然,_config.TimerInterval属性为0.这是*线程竞争*的典型标志,允许线程在* _config完全初始化之前启动*。当然,这可能意味着你的配置不好或丢失。 –