2013-09-30 44 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

如果你想分配這些因素,一次爲每個實例,使用實例之前......這樣做,在一個構造函數。

如果你想爲這個類型分配一次這些因子,在創建任何實例之前......在一個靜態構造函數中做。

不要在線程之間共享可變實例。

相關問題