[編輯:我意識到,失敗的參數實際上是一個雙精度,而不是整數。根據日誌,整數定時器都不會失敗。大多數定時器和參數都是整數,但不是全部。雙打併不是原子,畢竟缺少鎖定可能是問題。]爲什麼整數屬性有時會返回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完全初始化之前啓動*。當然,這可能意味着你的配置不好或丟失。 –