gpt4 book ai didi

c# - OutOfMemoryException 使用计时器已用事件 c#

转载 作者:行者123 更新时间:2023-11-30 22:39:45 24 4
gpt4 key购买 nike

使用时间时出现内存不足异常。是否与在结构中使用计时器有关 - 是否可以在结构中使用计时器,如下所示:

 public struct SessionStruct 
{
private bool _isElapsed;
public bool isElapsed
{
get{return _isElapsed;}
set { _isElapsed = value; }
}
public string sessionID
{
get;
set;
}
public DateTime time
{
get;
set;
}

public Timer timer
{ get; set; }

};

这是经过的事件处理程序:
static void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
req = "<Request><ID>1234567</ID><type>10</type><attribute>" + session1.sessionID + "|</attribute></Request>";}

[编辑]

这是实例化和设置值的代码 - 这只是其中的一部分......
        public Request(string request, Database db)
{

//实例化
s = 新 session 结构();
s.timer = 新定时器(60000);
s.timer.Enabled = true;
//db = 新数据库();
尝试
{
Debug.WriteLine("开始一个新的请求");
doc = 新的 XmlDocument();
doc.LoadXml(请求);
字符串属性 = "";
//string sessionID = "";
ArrayList attributeArray = new ArrayList();
ArrayList queryArray = new ArrayList();
            int iteration = 0;

bool hasSpecial = false ;
nodelist = doc.SelectNodes("/Request");
foreach (XmlNode xn in nodelist)
{
try
{
type = xn["type"].InnerText;
id = xn["ID"].InnerText;
attribute = xn["attribute"].InnerText;
Debug.WriteLine("Processing Request of type: " + type + "\nWith Id number: " + id + "\nWith attribute string: " + attribute);
for (int i = attribute.IndexOf('|'); i != -1; )
{
attributeArray.Add(attribute.Substring(0, i));
if (attribute.Substring(0, i).Contains('\''))
hasSpecial = true;
attribute = attribute.Substring(i + 1);

i = attribute.IndexOf('|');
}

//设置变量
if (type == "1"&& attributeArray.Count != 2)
{
s.sessionID = attributeArray[0].ToString();
s.time = DateTime.Now;
s.timer.Start();
isNotLogin = true;
attributeArray.RemoveAt(0);
}
否则如果(输入!=“1”)
{
s.sessionID = attributeArray[0].ToString();
s.time = DateTime.Now;
s.timer.Start();
isNotLogin = true;
attributeArray.RemoveAt(0);
}

我在这里返回结构
 public SessionStruct getSessionStruct()
{
return s;
}

它返回到另一个类,如:
                        sessStruct2 = iRequest.getSessionStruct();
int x;
for(x = 0; x< session.Count; x++)
{
sessStruct = (SessionStruct)session[x];


if (sessStruct.sessionID == sessStruct2.sessionID)
{
Debug.WriteLine("Resetting Session Timer");
session.RemoveAt(x);
sessStruct2.timer.Stop(); //resetting timer
sessStruct2.timer.Start();
Debug.WriteLine("Session Timer Reset SUCCESSFUL");
session.Add((object)sessStruct2);
Debug.WriteLine("Added Session "+sessStruct2.sessionID+" Successfully to sessions table");
guiServer.log("Added Session " + sessStruct2.sessionID + " Successfully to sessions table");
break;
}

}

if(x==session.Count)
{
session.Add(iRequest.getSessionStruct());
Debug.WriteLine("Added the session");
}

我创建了一个线程来检查计时器是否像这样过去了
while (true)
{
if (session.Count > 0)
{

session1 = (SessionStruct)session[0];
session1.timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed)

}
}

这是堆栈跟踪:
 first chance exception of type 'System.OutOfMemoryException' occurred in mscorlib.dll

System.Transactions 关键:0:http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/UnhandledUnhandled 异常VNurseService.exeSystem.OutOfMemoryException,mscorlib,版本=4.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089“System.OutOfMemoryException”类型的异常被抛出。在 System.MulticastDelegate.CombineImpl(Delegate follow)
在 System.Timers.Timer.add_Elapsed(ElapsedEventHandler 值)
在 VNurseService.Server.Session.checkSessionList()
在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()System.OutOfMemoryException: 类型“System.OutOfMemoryException”的异常被抛出。
在 System.MulticastDelegate.CombineImpl(Delegate follow)
在 System.Timers.Timer.add_Elapsed(ElapsedEventHandler 值)
在 VNurseService.Server.Session.checkSessionList()
在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()
mscorlib.dll 中发生类型为“System.OutOfMemoryException”的未处理异常

我知道这很令人困惑,但我们正在创建伪 session , session ID 来自请求,当解析请求时,它会插入 session ID 和时间,然后将计时器启动到结构中。然后将该结构返回到“主”类,然后根据 session 数组列表中的其他 session 对其进行检查。如果它在 arraylist 中,它会删除当前的并在 arraylist 的末尾添加新的结构。然后新线程检查 arraylist 以查看 arraylist 索引 0 处的 session 是否已经过去。

我希望这是有道理的。如果有其他实现或方式,请告诉我。

谢谢。

最佳答案

是的,您可以拥有一个 Timer (或任何其他类型)成为 struct 的成员.顺便说一句,您应该强烈考虑将其更改为 class (您将其设为 struct 是否有任何特殊原因?)或从您的属性中删除 setter ;可变结构,正如你在这里看到的,通常被认为是纯粹的邪恶。

这里没有太多内容可以说明您的环境以及可能导致您内存不足的原因。你能更详细地说明你是如何使用 struct 的吗? ?

问题后编辑

您不应该像现在这样重复附加到计时器的事件。您的 while循环将继续附加计时器处理程序的副本,这可能是您内存不足的地方。

关于c# - OutOfMemoryException 使用计时器已用事件 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5555493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com