在 C# 中将 Lambda 表达式添加到 DisplaySettingsChanged 事件处理程序
Adding Lambda Expression to DisplaySettingsChanged event handler in c#
我正在创建一个 C# WPF 自定义控件库,我的库使用来自 SystemEvents Class 的 DisplaySettingsChanged
事件,Microsoft 在文档中提到了分离事件处理程序。
Because this is a static event, you must detach your event handlers
when your application is disposed, or memory leaks will result.
那么是否可以在程序中使用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
}
}
你不能。 Lambda 是匿名的,因此您将无法分离事件,从而导致内存泄漏。
我认为,您可以将 lambda 存储在 class 级字段中,然后使用该值来分离事件,但这与不使用 lambda 的序号处理程序的方法几乎相同。
我正在创建一个 C# WPF 自定义控件库,我的库使用来自 SystemEvents Class 的 DisplaySettingsChanged
事件,Microsoft 在文档中提到了分离事件处理程序。
Because this is a static event, you must detach your event handlers when your application is disposed, or memory leaks will result.
那么是否可以在程序中使用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
}
}
你不能。 Lambda 是匿名的,因此您将无法分离事件,从而导致内存泄漏。
我认为,您可以将 lambda 存储在 class 级字段中,然后使用该值来分离事件,但这与不使用 lambda 的序号处理程序的方法几乎相同。