我正在开发一个GUI应用程序,它在很大程度上依赖于
假设我们有这个类
在应用程序的
在我们的情况下,
我的问题是,我是否正确地处理了回调委托?是否有任何情况可能会通过保留不应该引用的引用而导致内存膨胀?
更一般地说,如何安全和正确地处理匿名委托的处理方式?
Action<>
委托来自定义UI工具的行为。我想知道我们采用的方式是否存在潜在问题,例如实现是否保留对捕获变量、声明委托的类实例等的引用?假设我们有这个类
MapControl
,它包装了一个有状态的GUI控件。地图有不同种类的工具(绘图、选择等),由ITool
接口表示。您可以使用StartTool()
设置工具,但一次只能有一个工具处于活动状态,因此当设置另一个工具时,前一个工具将使用StopTool()
停止。当工具停止时,将执行调用者指定的回调委托。public class MapControl
{
ITool _currentTool;
Action<IResult> _onComplete;
public void StartTool(ToolEnum tool, Action<IResult> onComplete) {
//If tool is active, stop it first
if (_currentTool != null) StopTool();
_onComplete = onComplete;
//Creates a tool class, etc.
_currentTool = CreateTool(tool) as ITool;
}
public void StopTool() {
//Execute callback delegate
IResult result = _currentTool.GetResult();
if (_onComplete != null)
_onComplete(result);
//Nix the references to callback and tool
_onComplete = null;
_currentTool = null;
}
}
在应用程序的
ViewModel
类中,我们设置了一些工具,如下所示:class ViewModel
{
private MapControl _mapControl = new MapControl();
public void SetSomeTool()
{
//These variables will be captured in the closure
var someClassResource = this.SomeClassResource;
var someLocalResource = new object();
//Start tool, specify callback delegate as lambda
_mapControl.StartTool(ToolEnum.SelectTool, (IResult result) => {
//Do something with result and the captured variables
someClassResource.DoSomething(result, someLocalResource);
});
}
}
在我们的情况下,
ViewModel
类附加到WPF应用程序的主窗口上,在应用程序生命周期内只能有一个ViewModel
实例。如果不是这种情况,声明委托的类会更短暂,这会改变什么吗?我的问题是,我是否正确地处理了回调委托?是否有任何情况可能会通过保留不应该引用的引用而导致内存膨胀?
更一般地说,如何安全和正确地处理匿名委托的处理方式?