System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。
在 System.Collections.Generic.List1.set_Capacity(Int32 value) 在 System.Collections.Generic.List
1.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();
}
m_cacheData[keyText].cacheList.Add(pfltData[i]);
data.cacheList.Add(pfltData[i]);
m_cacheData.Add(keyText, data);
这几个都有可能,是累加到内存的,所以用完了要有地方清理list列表
哦哦
本機運行還是server?
是服务端
@bokeyuan_number_1:
那得看看配置了,報錯時資源是不是真的被吃光
或是IIS的設定限制住了
@RosonJ: 没有用到iis,是c#winform程序获取数据后把数据写入到文本文件里面,然后在通过http请求调用web api接口把数据文件发送到另一台服务器上。我看报错的地方是在写缓存里面,不知道什么原因导致的
@bokeyuan_number_1:
那得實際跑一次看看資源使用量,資料量大嗎?
@RosonJ: 看资源管理器中,这个进程内存占用的都不大
@bokeyuan_number_1:
這就有點弔詭了
報錯時cacheList 有多少資料?
@RosonJ: 看日志里面不多,几十个
@bokeyuan_number_1:
哇賽..那真得查查了..
@RosonJ: 大佬,看我这里面的代码,能不能定位到代码错在哪里
@bokeyuan_number_1:
m_cacheData 裡面的資料量大嗎?
大概能推測出錯在哪行,但我不認為是寫錯
@RosonJ: 好的,我在加个日志看看
内存溢出了
嗯,是的。不知道是代码哪里写的不对