是否应该将我创建或直接指定为背景的所有画笔设置为“冻结”?那我不修改的其他用户控件呢?
Freezable提供一个Changed事件,以通知观察者对该对象的任何修改。冻结Freezable可以提高其性能,因为它不再需要在更改通知上花费资源。冻结的Freezable也可以跨线程共享,而未冻结的Freezable不能共享。
由此看来,如果我的应用程序从不对创建的画笔进行任何更改,那么无论我是否设置为冻结它,在性能方面都没有区别。我说得对吗?
是否应该将我创建或直接指定为背景的所有画笔设置为“冻结”?那我不修改的其他用户控件呢?
Freezable提供一个Changed事件,以通知观察者对该对象的任何修改。冻结Freezable可以提高其性能,因为它不再需要在更改通知上花费资源。冻结的Freezable也可以跨线程共享,而未冻结的Freezable不能共享。
由此看来,如果我的应用程序从不对创建的画笔进行任何更改,那么无论我是否设置为冻结它,在性能方面都没有区别。我说得对吗?
我应该将我创建或直接分配为背景的所有画笔设置为“冻结”吗?
是的,假设您不打算修改它们。这样可以避免系统必须监视它们的修改,更新它们在引擎盖下使用的相应非托管资源。
由于冻结Freezable
对象可提供此性能优势,因此,当您知道它们不会被修改时,冻结它们是一种最佳做法。
例如,如果您在后台线程上创建Brush
,则必须冻结它,以便能够将其分配给UI线程上的UIElement
的属性。
请确保您按照docs中的说明检查CanFreeze
属性的值。
您可以使用PresentationOptions:Freeze Attribute冻结XAML资源。
,在可能的情况下,您应该尽可能放置一个或多个资源字典中会大量使用的画笔。
只要您不使画笔的一部分依赖于某些变量,它们就会被自动冻结。将它们合并到app.xaml中,以便可以在整个应用程序中使用它们。
对于大多数WPF开发人员而言,这是冻结过程最常见的用法,它们会自动完成。
如果您使用未冻结的可冻结对象,则将订阅已更改的事件,以便将可能的更改驱动到视图。如果冻结它,则将不预订此事件,因此效率更高。不过,在您可能会注意到这种问题之前,您将不得不使用大量未冻结的可冻结对象。
如果您进行了大量图形处理(例如编写游戏),则将诸如动态构建的几何图形之类的可冻结对象从后台线程传递到UI可能很有趣并且意义重大。但是,您可以编写许多业务应用程序,而无需执行此类操作。
您可以冻结的东西非常有限-它们必须从freezable继承。用户控件没有。
如果您阅读该列表,则可能会花更多的时间在思考“那是什么”而不是“是的,我可以看到自己冻结了... ThumbButtonInfo”。
https://docs.microsoft.com/en-us/dotnet/api/system.windows.freezable?view=netframework-4.8