我使用VS 2005傳遞進行日誌記錄有效
我有大約10-12個不同類型的如雙,INT,弦長和布爾變量,我要登錄另一個線程之間大量的變量最小線程。高架。
當前,每當我必須登錄時,我「新建」一個數組列表,在其中添加所有變量,然後將其作爲參數傳遞給LoggerClass.Log()。在LoggerClass中,它設置/重置事件,另一個線程讀取arraylist的值。
由於該函數被調用了很多,執行「new」效率不是很高,我正在尋找一種方法將所有值傳遞給另一個線程,而無需動態內存分配。
我腦海中的另一個替代方案是不是「新」的數組列表,但只是不斷增加它,但問題在於數組列表的大小可能變得令人en目。
有什麼建議嗎?
繼承人的代碼
//This function gets called a thousand times per second
private void MyLogic(MyClass LogObj)
{
ArrayList MyArrList = new ArrayList(15);//This line causes periodic performance outliers
MyArrList.Add("Q");
MyArrList.Add(LogObj.valString);
MyArrList.Add(LogObj.ValDouble);
MyArrList.Add(LogObj.ValInt);
MyArrList.Add(LogObj.valString2);
MyArrList.Add(LogObj.ValDouble2);
MyArrList.Add(LogObj.ValInt2);
MyArrList.Add(LogObj.valString3);
MyArrList.Add(LogObj.ValDouble3);
MyArrList.Add(LogObj.ValInt3);
MyArrList.Add(LogObj.valString4);
MyArrList.Add(LogObj.ValDouble4);
MyArrList.Add(LogObj.ValInt4);
MyLogger.Log(MyArrList);
}
Class MyLogger
{
private Queue m_logQueue;
public void Log(ArrayList LogArr)
{
lock (m_LogQueue)
{
m_LogQueue.Enqueue(LogArr);
}
m_Event.Set();
}
}
private void LogThread()
{
ArrayList ValuesToLog = new ArrayList();
StringBuilder StringBuf = new StringBuilder();
string csFileName = "MyLog";
using (StreamWriter sw = new StreamWriter(new FileStream(csFileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
{
while (m_bRun)
{
m_Event.WaitOne();
try
{
while (true)
{
lock (m_logQueue)
{
if (m_logQueue.Count > 0)
{
ValuesToLog = (ArrayList)m_logQueue.Dequeue();
}
else
break;
}
StringBuf = new StringBuilder();
StringBuf.Append(DateTime.Now);
StringBuf.Append(",");
for (int i = 0; i < (ValuesToLog.Count - 1); i++)
{
StringBuf.Append(",");
StringBuf.Append(ValuesToLog[i]);
}
sw.WriteLine(StringBuf.ToString());
if (m_bAbort) break;
if (m_EventStop.WaitOne(0, true))
break;
}
sw.Flush();
}
catch(Exception e)
{
}
}
}
}
你爲什麼不使用'List'? ArrayLists是.net 1.1。 –
@AustinSalonen:他傳球不同。 – SLaks
'列表