尝试......抓住神秘地继续执行代码(有时只...)

时间:2014-10-02 00:38:40

标签: c# multithreading try-catch

在下面的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

            }
        }
    }

}

1 个答案:

答案 0 :(得分:1)

您的代码在成功转换后将标志设置为false,并在处理程序中设置为true。

如果您的代码混合了好转换和坏转换,则标记将切换并且您会收到多个错误。

您可以将设置删除回&#34; false&#34;确保每个错误仅打印一次。也许使用计数器而不是bool。仅在计数器为0时输出错误。这样您就知道错误发生了多少次(出于调试目的),但只报告一次。