gpt4 book ai didi

c# - 多线程 c# 应用程序 System.OutOfMemoryException 在运行 1~5 分钟后

转载 作者:行者123 更新时间:2023-11-30 20:08:50 26 4
gpt4 key购买 nike

这是我的计时器已用事件,我在 Thread thread = new Thread(threadStart); 行收到 System.OutOfMemoryException我收到错误的速度相当快(1~5 分钟,随机),它不会在我的程序中导致意外结果。我只是想知道是什么导致了这个错误,我担心如果不检查它可能会导致意想不到的结果。我在互联网上搜索过,但没有找到接近最大线程数的地方。readList 包含大约 46 个条目。

如有任何帮助,我们将不胜感激。

private void glob_loopTimer_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
ParameterizedThreadStart threadStart = new ParameterizedThreadStart(readHoldingRegisters);
foreach (readwriteDataGridRow.Read row in readList)
{
Thread thread = new Thread(threadStart);
thread.IsBackground = true;
thread.Start(System.Convert.ToInt32(row.Address));
}
}
catch (Exception ex)
{
UpdateConsole(new object[] { ex.Message.ToString() + " " + ex.StackTrace.ToString(), Color.Red });
Thread.CurrentThread.Abort(); // maybe?
}
}

编辑:这里有更多信息。我的程序正在使用 Modbus RTU 协议(protocol)从串行设备读取寄存器。从 readHoldingRegisters 检索单个寄存器需要不到十分之一秒

我愿意听取关于除线程之外还可以使用什么的建议。注意:我需要在一次“通过”中调用 readHoldingRegisters 40 - 100 次。通行证在用户点击连接时开始,在他点击断开连接时结束。不需要计时器,它们只是为我提供了一种简单的方法来使用开始和停止按钮来维持循环。

编辑:已解决

    private void glob_loopTimer_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
foreach (readwriteDataGridRow.Read row in readList)
{
readHoldingRegisters(row.Address);
}
}
catch (Exception ex)
{
UpdateConsole(new object[] { ex.Message.ToString() + " " + ex.StackTrace.ToString(), Color.Red });
}
}

额外的线程是问题所在,不需要。

最佳答案

,永远不要(几乎永远)中止线程。有许多更好的方法可以使 System.Thread 停止。环顾SO,您会发现大量示例说明为什么这样做是个坏主意和替代方法。

关于您的问题:问题似乎不是 readList 中的行数。您的 glob_looperTimer_Elapsed 事件处理程序更有可能被执行多次,您基本上启动了越来越多的线程。

glob_loopTimer 的间隔是多少?

关于c# - 多线程 c# 应用程序 System.OutOfMemoryException 在运行 1~5 分钟后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6664495/

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