Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序间歇性地变为无响应_C#_Winforms_Performance_Memory - Fatal编程技术网

C# 应用程序间歇性地变为无响应

C# 应用程序间歇性地变为无响应,c#,winforms,performance,memory,C#,Winforms,Performance,Memory,我们有一个内置于.NET4.5(C#,Winforms)中的应用程序,它只有在一个生产环境中才会进入无响应状态,持续10到20秒。 我在重要的行上写了日志。它依赖于加载大量用户控件和完成数据获取调用 挂起它的系统内存相当低,为2GB。通过降低内存,我几乎在本地机器上再现了这种情况。我的问题是我有什么选择来避免这些问题。 应用程序内存确实会从200增加到300 mb。 这种行为是不一致的。有时完成一项任务需要30秒,下一次则需要3秒。 无响应状态通常在启动时出现 我最后一次尝试是在启动时加载重要组

我们有一个内置于
.NET4.5(C#,Winforms)
中的应用程序,它只有在一个生产环境中才会进入
无响应状态,持续
10到20秒。

我在重要的行上写了日志。它依赖于加载大量用户控件和完成数据获取调用

挂起它的系统内存相当低,为2GB。通过降低内存,我几乎在本地机器上再现了这种情况。我的问题是我有什么选择来避免这些问题。 应用程序内存确实会从
200增加到300 mb。

这种行为是不一致的。有时完成一项任务需要30秒,下一次则需要3秒。 无响应状态通常在启动时出现

我最后一次尝试是在启动时加载重要组件,但我没有运气


最后让我告诉您,我们有几个第三方控件。

如果您关心内存分配

使用“分析”菜单中“性能向导”的.NET内存分配选项创建性能会话,该会话将帮助您确定需要在代码中进行哪些更改以减少内存使用

我们需要更多的信息。但有几点建议:

在以下情况下,对所有一次性对象使用using关键字或调用Dispose() 你受够了

确保在完成侦听后注销事件处理程序 事件

如果应用程序中有很多计时器

这只是System.Threading.Timer类的一个问题,如果您没有在其他地方存储对它的引用。它有几个构造函数重载,其中接受state对象的重载很重要。CLR关注该状态对象。只要它被引用到某个地方,CLR就会将计时器保持在其计时器队列中,并且计时器对象不会被垃圾收集。大多数程序员不会使用该状态对象,MSDN文章肯定没有解释它的作用


System.Timers.Timer是System.Threading.Timer类的包装器,使其更易于使用。特别是,只要启用计时器,它就会使用该状态对象并保留对该对象的引用。

要防止应用程序冻结,您至少需要做一件事。首先,您需要异步运行繁重的任务。使用线程、任务或异步方法。其次,不要加载视图中的所有数据。使用分页/筛选。@Kalten,调用是异步的。是的,第二个选项也是一些需要注意的选项。。目前我正在讲述它的记忆。。你认为我的方向对吗。。应用程序已在实时环境中运行了5年多,您能在哪里发布一些代码来进行加载吗?处理和注销事件已经完成。。让我再跟你分享一件事,我们有很多计时器,所以你的问题的答案似乎是,计时器不符合垃圾收集的条件,如果你不维护对它的引用,它将不会被收集。请使用System.Threading.timer而不是System.Timers.timer,您会发现计时器是垃圾收集的,您可以使用它减少内存消耗。