【问题标题】:Adding Lambda Expression to DisplaySettingsChanged event handler in c# [duplicate]在 c# 中将 Lambda 表达式添加到 DisplaySettingsChanged 事件处理程序 [重复]
【发布时间】:2021-11-10 12:10:43
【问题描述】:

我正在创建一个 C# WPF 自定义控件库,我的库使用来自 SystemEvents 类的DisplaySettingsChanged 事件,在 Microsoft 提到的有关分离事件处理程序的文档中。

因为这是一个静态事件,您必须分离事件处理程序 当您的应用程序被释放时,否则将导致内存泄漏。

那么是否可以在程序中使用 lambda 表达式而不导致内存泄漏(不使用 -=)

这意味着:

我可以用这个吗:

SystemEvents.DisplaySettingsChanged += (_, _) =>
{
   // My code Here
};

而不是使用这个:

SystemEvents.DisplaySettingsChanged += OnDisplaySettingsChanged;
SystemEvents.DisplaySettingsChanged -= OnDisplaySettingsChanged; // Calling this in Dispose Method

完整代码

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Interop;

namespace FluentCompositor.Core
{
    public sealed class CompositionMetrics : IDisposable
    {
        private readonly HwndSource hwndSource;

        public CompositionMetrics(HwndSource source)
        {
            hwndSource = source;
            SystemEvents.DisplaySettingsChanged += OnDisplaySettingsChanged; //added event handler over here
        }

        private void OnDisplaySettingsChanged(object? sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

        public void Dispose()
        {
            SystemEvents.DisplaySettingsChanged -= OnDisplaySettingsChanged; // disposing event handler here
        }

        #region Properties

        public int Width
        {
            get;
            private set;
        }

        public int Height
        {
            get;
            private set;
        }

        public double ScaleFactor
        {
            get;
            private set;
        }

        #endregion
    }
}

【问题讨论】:

  • 文档明确说必须取消订阅否则会发生内存泄漏,并询问是否可以忽略取消订阅而不会导致内存泄漏?

标签: c# wpf eventhandler


【解决方案1】:

你不能。 Lambda 是匿名的,因此您将无法分离事件,从而导致内存泄漏。

我认为,您可以将 lambda 存储在类级字段中,然后使用此值来分离事件,但这与没有 lambda 的序数处理程序的方法几乎相同。

【讨论】:

  • 谢谢,在 dispose() 中分离事件处理程序是合适的方法吗?
  • 是的,在Dispose 中分离是绝对合适的。请注意,为对象调用Dispose 完全由开发人员负责。如果开发人员不调用它,您将有泄漏。
  • 当然,我将这个类用于内部使用,它不会暴露在库之外。我将使用内部访问说明符,并将在我使用 CompositionMetrics 对象的类上调用 Dispose。谢谢你
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多