Ric*_*ler 5 c# multithreading properties timer c#-4.0
[编辑:我意识到失败的参数实际上是一个double而不是整数.根据日志,整数计时器都不会失败.大多数计时器和参数都是整数,但不是全部.双打不是原子的,毕竟缺乏锁定可能是个问题.
我有一个应用程序,它使用包含可配置值属性的类.应用程序中使用的大多数属性都是派生的.这些值在启动时设置,并且在应用程序的主要部分运行时不会更改.
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; }
}
Run Code Online (Sandbox Code Playgroud)
我发现由于异常,返回的值很少显然为零.
Exception Message: '0' is not a valid value for 'Interval'. 'Interval' must be greater than 0.
Exception Target Site: set_Interval
Run Code Online (Sandbox Code Playgroud)
调用代码看起来像石灰:
exitTimer.Interval = _config.TimerInterval;
Run Code Online (Sandbox Code Playgroud)
该程序是多线程的,但对单个属性的调用仅在一个线程中使用.该类的其他属性在其他线程中调用.我确实在其他具有类似属性的计时器上看到了这个问题.
如果我捕获异常并重试分配它是有效的.
我的计时器会发生什么事情会导致除了属性返回零以外的执行?
更新#1 - 请求了更多代码
每个字段定义为cfXXX(配置字段)常量.这可以确保我们不会拼错字段名称.每个属性的相应默认值定义为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;
}
Run Code Online (Sandbox Code Playgroud)
问题是前提是错误的。失败的属性实际上是浮点数而不是整数。尴尬。正如预期的那样,为这些项目的属性添加锁解决了问题。整数计时器从未失败。
我此时就删除了这个问题,但它已经有了答案。因此,让它成为双重检查假设的一课。