在下面的C#代码中,假设sample
是20000。
然后调用Convert.ToInt16
的行会在尝试转换20000 * 3.2(大于32768)时抛出溢出异常。
在该异常中,它将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
}
}
}
}
答案 0 :(得分:1)
您的代码在成功转换后将标志设置为false,并在处理程序中设置为true。
如果您的代码混合了好转换和坏转换,则标记将切换并且您会收到多个错误。
您可以将设置删除回&#34; false&#34;确保每个错误仅打印一次。也许使用计数器而不是bool。仅在计数器为0时输出错误。这样您就知道错误发生了多少次(出于调试目的),但只报告一次。