几何尺寸与公差论坛

 找回密码
 注册
查看: 2273|回复: 5

wpf 主线程默认的最大内存是多大?什么时候会自动开启垃圾回收?

  [复制链接]
发表于 2023-3-25 09:07:01 | 显示全部楼层 |阅读模式
在 WPF 应用程序中,主线程默认的最大内存大小取决于应用程序的目标框架版本和运行环境。在 .NET Framework 4.5 及更高版本中,默认情况下,WPF 应用程序的主线程最大内存大小为 1.2 GB。而在 .NET Core 3.0 及更高版本中,默认情况下,WPF 应用程序的主线程最大内存大小为 2 GB。

当应用程序使用的内存达到一定阈值时,.NET 运行时会自动开启垃圾回收来释放不再使用的内存。具体来说,当应用程序中的对象数量增加并占用越来越多的内存时,.NET 运行时会自动调用垃圾回收器来清理未被引用的对象。这个阈值会根据应用程序的运行环境和目标框架版本而有所不同,但通常情况下应该不会超过默认的最大内存大小。
 楼主| 发表于 2023-3-25 09:18:23 | 显示全部楼层
如何修改wpf主线程的最大内存?
 楼主| 发表于 2023-3-25 11:17:38 | 显示全部楼层
WPF(Windows Presentation Foundation)是Microsoft Windows上的一个应用程序框架,它提供了许多构建 Windows 客户端应用程序所需的功能。在WPF应用程序中,主线程的最大内存大小可以通过在应用程序配置文件中设置相关参数来实现。

在WPF应用程序的配置文件 app.config 中,可以添加以下内容以增加主线程的最大内存:

xml
Copy code
<configuration>
   <runtime>
      <gcAllowVeryLargeObjects enabled="true" />
   </runtime>
</configuration>
这将启用.NET Framework中的大对象堆(LOH)分配。启用大对象堆允许在主线程中分配大于85K的对象,以提高性能。

此外,也可以通过使用<gcConcurrent>和 <gcServer>配置来调整垃圾回收器的设置以优化内存使用情况。例如:

xml
Copy code
<configuration>
   <runtime>
      <gcAllowVeryLargeObjects enabled="true" />
      <gcConcurrent enabled="true" />
      <gcServer enabled="true" />
   </runtime>
</configuration>
这将启用并发垃圾回收(<gcConcurrent>)和服务器垃圾回收(<gcServer>)以优化垃圾回收性能。

请注意,在修改配置文件之前,请备份应用程序的配置文件以防止出现任何问题。
 楼主| 发表于 2023-3-25 11:21:32 | 显示全部楼层
wpf在绘制百万EllipseGeometry图形时出现了无响应的情况,如何用c#代码解决?
在 WPF 中绘制大量图形会影响程序的性能,特别是在处理大量的可绘制图形时。 如果您需要绘制大量的图形,可以尝试以下几种方法来提高性能:

1.使用 UI 虚拟化:UI 虚拟化是一种技术,可以仅在屏幕上显示可见的元素。当滚动到新的区域时,它会自动加载其他元素。这可以显著减少绘图和布局所需的时间和资源。您可以在控件中启用 UI 虚拟化,例如 ListBox、ListView 和 DataGrid。

2.使用 DrawingContext:DrawingContext 类提供了一种比直接在 Canvas 上绘制图形更高效的方法。 使用 DrawingContext,您可以以比使用 EllipseGeometry 更高效的方式绘制大量图形。 您可以通过创建一个继承自 FrameworkElement 的自定义控件,并在 OnRender 方法中使用 DrawingContext 来实现此目的。

3.使用异步绘图:如果您需要绘制大量图形,可以考虑使用异步绘图。 您可以在后台线程中绘制图形,然后将其传输回 UI 线程以显示。 这可以防止 UI 线程被阻塞,并且可以提高绘图的速度和性能。

4.使用缓存:WPF 中的缓存是一种可以显著提高性能的技术。您可以将绘图对象缓存到内存中,并在需要时将其重新使用。 这可以减少绘图和布局所需的时间和资源,并提高程序的响应能力。

综上所述,以上是一些提高 WPF 绘图性能的方法。 您可以根据自己的需求选择其中一个或多个方法来解决问题。
 楼主| 发表于 2023-3-25 15:45:46 | 显示全部楼层
wpf中的UI元素如何开启多线程绘制?
在WPF中,UI元素绘制是在UI线程上完成的。这意味着如果您需要绘制复杂的UI元素,可能会阻塞UI线程,从而导致应用程序变得不响应。为了避免这种情况,您可以使用多线程来绘制UI元素。

下面是一些在WPF中开启多线程绘制UI元素的方法:

使用后台线程绘制:您可以使用后台线程来执行复杂的UI元素绘制操作,然后将结果传递回UI线程以更新UI元素。在这种情况下,您需要使用 Dispatcher.BeginInvoke 方法将结果传递回UI线程,以确保UI元素的更新在正确的线程上执行。

使用异步绘制:WPF提供了一个 RenderTargetBitmap 类,可以将UI元素渲染到图像中。您可以在后台线程中使用此类异步地渲染UI元素,并在渲染完成后将结果传递回UI线程以更新UI元素。

使用VisualTarget:VisualTarget是WPF提供的一种机制,它允许您在后台线程上创建和更新UI元素。要使用VisualTarget,您需要创建一个 VisualTargetPresentationSource,然后使用它创建和更新UI元素。

请注意,在使用多线程绘制UI元素时,您需要小心处理线程间同步和通信,以避免发生竞态条件或死锁等问题。同时,多线程绘制UI元素可能会带来额外的复杂性和性能开销,因此应该谨慎使用,并仅在必要时使用。
 楼主| 发表于 2023-3-25 15:48:41 | 显示全部楼层
public async Task<BitmapSource> RenderCirclesAsync(int count, double radius, double width, double height)
{
    // create a new RenderTargetBitmap with the specified width and height
    RenderTargetBitmap renderTarget = new RenderTargetBitmap(
        (int)width, (int)height, 96, 96, PixelFormats.Pbgra32);

    // create a new DrawingVisual for rendering the circles
    DrawingVisual drawingVisual = new DrawingVisual();

    // create a new Random instance for generating random circle positions
    Random random = new Random();

    // create a new SolidColorBrush for filling the circles
    SolidColorBrush fillBrush = new SolidColorBrush(Colors.Blue);

    // create a new Pen for outlining the circles
    Pen strokePen = new Pen(Brushes.Black, 1.0);

    // render the circles asynchronously
    await Task.Run(() =>
    {
        using (DrawingContext drawingContext = drawingVisual.RenderOpen())
        {
            for (int i = 0; i < count; i++)
            {
                double x = random.NextDouble() * width;
                double y = random.NextDouble() * height;

                drawingContext.DrawEllipse(fillBrush, strokePen, new Point(x, y), radius, radius);
            }
        }
    });

    // render the drawing visual to the RenderTargetBitmap
    renderTarget.Render(drawingVisual);

    // return the rendered bitmap source
    return renderTarget;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-4-28 08:27 , Processed in 0.087192 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表