【发布时间】: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