首页 新闻 会员 周边

C#程序运行一会后引发类型为“System.OutOfMemoryException”的异常。

0
悬赏园豆:20 [已解决问题] 解决于 2020-05-12 10:57

System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。
在 System.Collections.Generic.List1.set_Capacity(Int32 value) 在 System.Collections.Generic.List1.EnsureCapacity(Int32 min)
在 System.Collections.Generic.List`1.Add(T item)
在 TestWFApplication.Form1.OnSaveToDB(Int32 nDataCount, Single[] pfltData, Int32 nSelGroupID, Int32 nChannelNO)
每隔一秒取数据写入缓存中,然后在从缓存中读取保存在文本文件里。
1.开启一个线程
public void tets()
{
InitializeChart();
Thread myThread = new Thread(GetDataThread);
myThread.IsBackground = true;
myThread.Start();
m_startTime = DateTime.Now;
//请定时发送
System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
timer1.Interval = 1000;
timer1.Enabled = true;
timer1.Tick += new EventHandler(timer1EventProcessor);
}
2.获取数据
public void GetDataThread()
{

        int nBufferSize = 1024 * 1024;
        IntPtr pBuffer = Marshal.AllocHGlobal(sizeof(float) * nBufferSize);
        while (this.m_bThread)
        {
            int nTotalDataPos, nReceiveCount, nChnCount, lReturnValue;
            axDHTestHardWare2.GetAllChnData(nBufferSize, (int)pBuffer, out nTotalDataPos, out nReceiveCount, out nChnCount, out lReturnValue);
            if (nReceiveCount <= 0)
                continue;
            float[] pValue = new float[nReceiveCount * nChnCount];
            Marshal.Copy(pBuffer, pValue, 0, nReceiveCount);
            for (int k = 0; k < nChnCount; ++k)
            {
                float[] BufferPoint = GetChannelData(nSelGroupID, k, pValue, nReceiveCount);
                this.BeginInvoke(new OnShowSampleDataDelete(OnShowSampleData), BufferPoint.Length, BufferPoint, nSelChanID, k);
            }

            Thread.Sleep(1000);
        }
        Marshal.FreeHGlobal(pBuffer);
    }

3.写入缓存
void OnSaveToDB(int nDataCount, float[] pfltData, int nSelGroupID, int nChannelNO)
{
string keyText = CacheData.GenKey(nSelGroupID, nChannelNO);

        SendWriteLock.EnterWriteLock();
        if (m_cacheData.ContainsKey(keyText))
        {
            for (int i = 0; i < nDataCount; ++i)
                m_cacheData[keyText].cacheList.Add(pfltData[i]);
        }
        else
        {
            CacheData data = new CacheData();

            data.nGroupID = nSelGroupID;
            data.nChannelNO = nChannelNO;
            data.startTime = m_startTime;
            data.nSecond = 0;
            for (int i = 0; i < nDataCount; ++i)
                data.cacheList.Add(pfltData[i]);
            m_cacheData.Add(keyText, data);
        }
        SendWriteLock.ExitWriteLock();
    }
bokeyuan_number_1的主页 bokeyuan_number_1 | 初学一级 | 园豆:83
提问于:2020-03-27 17:00
< >
分享
最佳答案
0

m_cacheData[keyText].cacheList.Add(pfltData[i]);

 

data.cacheList.Add(pfltData[i]);

 

m_cacheData.Add(keyText, data);

 

这几个都有可能,是累加到内存的,所以用完了要有地方清理list列表

收获园豆:20
悟行 | 专家六级 |园豆:12559 | 2020-03-30 16:54

哦哦

bokeyuan_number_1 | 园豆:83 (初学一级) | 2020-03-31 11:11
其他回答(2)
0

本機運行還是server?

RosonJ | 园豆:4910 (老鸟四级) | 2020-03-27 17:10

是服务端

支持(0) 反对(0) bokeyuan_number_1 | 园豆:83 (初学一级) | 2020-03-27 17:15

@bokeyuan_number_1:
那得看看配置了,報錯時資源是不是真的被吃光
或是IIS的設定限制住了

支持(0) 反对(0) RosonJ | 园豆:4910 (老鸟四级) | 2020-03-27 17:16

@RosonJ: 没有用到iis,是c#winform程序获取数据后把数据写入到文本文件里面,然后在通过http请求调用web api接口把数据文件发送到另一台服务器上。我看报错的地方是在写缓存里面,不知道什么原因导致的

支持(0) 反对(0) bokeyuan_number_1 | 园豆:83 (初学一级) | 2020-03-27 17:22

@bokeyuan_number_1:
那得實際跑一次看看資源使用量,資料量大嗎?

支持(0) 反对(0) RosonJ | 园豆:4910 (老鸟四级) | 2020-03-27 17:24

@RosonJ: 看资源管理器中,这个进程内存占用的都不大

支持(0) 反对(0) bokeyuan_number_1 | 园豆:83 (初学一级) | 2020-03-27 17:30

@bokeyuan_number_1:
這就有點弔詭了
報錯時cacheList 有多少資料?

支持(0) 反对(0) RosonJ | 园豆:4910 (老鸟四级) | 2020-03-27 17:34

@RosonJ: 看日志里面不多,几十个

支持(0) 反对(0) bokeyuan_number_1 | 园豆:83 (初学一级) | 2020-03-27 17:53

@bokeyuan_number_1:
哇賽..那真得查查了..

支持(0) 反对(0) RosonJ | 园豆:4910 (老鸟四级) | 2020-03-27 17:56

@RosonJ: 大佬,看我这里面的代码,能不能定位到代码错在哪里

支持(0) 反对(0) bokeyuan_number_1 | 园豆:83 (初学一级) | 2020-03-27 17:57

@bokeyuan_number_1:
m_cacheData 裡面的資料量大嗎?
大概能推測出錯在哪行,但我不認為是寫錯

支持(0) 反对(0) RosonJ | 园豆:4910 (老鸟四级) | 2020-03-27 18:00

@RosonJ: 好的,我在加个日志看看

支持(0) 反对(0) bokeyuan_number_1 | 园豆:83 (初学一级) | 2020-03-27 18:02
0

内存溢出了

风行天下12 | 园豆:3867 (老鸟四级) | 2020-03-27 17:24

嗯,是的。不知道是代码哪里写的不对

支持(0) 反对(0) bokeyuan_number_1 | 园豆:83 (初学一级) | 2020-03-27 17:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册