在下面的C#代碼中,假設sample
是,比如說20000. 然後調用Convert.ToInt16
的行會引發溢出異常,因爲它試圖轉換20000 * 3.2(大於32768)。Try ... catch mysteriously繼續執行代碼(有時只有...)
在該異常中,它將bool標誌設置爲true(dataErrorWritten),它應該會停止錯誤消息被多次寫入。
但是,我所看到的是一些情況下,錯誤消息每次都會不斷寫入,並且看起來dataErrorWritten
標誌沒有做任何事情。這怎麼可能?一旦第一次發現異常,dataErrorWritten[i]
將被設置爲true,並且在下次出現異常時不應打印任何錯誤。事實上,這在99%的時間內工作,但是在某些奇怪的情況下它不會。
ProcessInData在靜態類中的自己的線程上運行。
任何想法將不勝感激。謝謝。 我已經在這個程序中追蹤了一個多線程錯誤(共享數據隊列無鎖),我想這可能與多線程有關,但我看不出如何。
private static bool[] dataErrorWritten;
private static void ProcessInData()
{
short[][] bufferedData = new short[800][];
short sample;
//initialise this bool array to false
dataErrorWriten = new bool[32];
for (int i = 0; i < 32; i++)
{
dataErrorWriten[i] = false;
}
//create buffered data arrays
for (int i = 0; i < bufferedData.Length; i++)
{
bufferedData[i] = new short[32];
}
//loop always true
while (processData)
{
//... Increment bufferLocation
for (int i = 0; i < 32; i++) {
//Get a sample of data
sample = GetSampleFromSomewhere();
try {
bufferedData[bufferLocation][i] = Convert.ToInt16(((float)sample * 3.2);
dataErrorWritten[i] = false;
}
catch (Exception) {
if (!dataErrorWritten[i]) {
EventLog.WriteToErrorLogFile("Invalid UDP sample value " + sample + " received for channel " + (i + 1).ToString() + ".");
dataErrorWritten[i] = true;
}
// ... set buffered data within bounds
}
}
}
}
感謝您的幫助!而已。很簡單。 – Rhett 2014-10-02 01:12:04