gpt4 book ai didi

c# - 为什么整数属性有时会返回 0?

转载 作者:太空狗 更新时间:2023-10-29 23:31:49 25 4
gpt4 key购买 nike

[编辑:我意识到失败的参数实际上是 double 而不是整数。根据日志,没有一个整数计时器失败。大多数定时器和参数都是整数,但不是全部。 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; }
}

我发现很少有由于异常而返回的值显然为零。

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;

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

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

除了属性返回零之外,我的计时器是否会发生一些会导致异常的事情?

更新 #1 - 请求了更多代码

每个字段都定义为一个cfXXX(配置字段)常量。这确保我们不会拼错字段名称。每个属性的相应默认值定义为 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;
}

最佳答案

问题是前提错了。失败的属性实际上是 float 而不是整数。尴尬。正如预期的那样,为这些项目的属性添加锁解决了这个问题。整数计时器从未失败。

此时我会直接删除问题,但它已经有了答案。因此,让它成为关于双重检查假设的一课。

关于c# - 为什么整数属性有时会返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19095042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com