【发布时间】:2012-05-16 14:18:47
【问题描述】:
我订阅了这样的活动:
private void CoupleOverlay(IMapVisual mapVisual)
{
overlay.DrawTilesProgressChanged += (s, e) =>
{
mapVisual.DrawingProgress = e.ProgressPercentage;
};
}
应用程序可能会多次调用 CoupleOverlay 事件,因此我需要取消订阅 DrawTilesProgressChanged 事件并再次订阅,但因为它是一个匿名事件,我无法取消订阅。我试图转换为
private void CoupleOverlay(IMapVisual mapVisual)
{
overlay.DrawTilesProgressChanged -=overlay_DrawTilesProgressChanged;
overlay.DrawTilesProgressChanged +=overlay_DrawTilesProgressChanged;
}
private void overlay_DrawTilesProgressChanged(object sender, DrawTilesProgressChangedTileOverlayEventArgs e)
{
mapVisual.DrawingProgress = e.ProgressPercentage;
}
它不起作用,因为mapVisual 在overlay_DrawTilesProgressChanged 方法上不是有效变量。
如果我将代码更改为
private void CoupleOverlay(IMapVisual mapVisual)
{
EventHandler<DrawTilesProgressChangedTileOverlayEventArgs> drawEvent = (s, e) =>
{
mapVisual.DrawingProgress = e.ProgressPercentage;
};
overlay.DrawTilesProgressChanged -= drawEvent;
overlay.DrawTilesProgressChanged += drawEvent;
}
它不起作用,因为drawEvent 是一个局部变量,下次我调用 CoupleOverlay 时,它会创建一个新变量。
那么我怎样才能取消订阅这个事件处理程序呢?或者我怎么知道我已经订阅了该活动,所以我不需要再次订阅?
【问题讨论】:
-
一种解决方案是将
drawEvent设为字段而不是局部变量。 -
为什么需要退订?只需在
Dispose()订阅和删除订阅即可。 -
@IAbstract:我有一个包含子图层的图层,首先我为所有子图层调用 CoupleOverlay,如果用户更改子图层的定义,我需要再次为所有子图层调用 CoupleOverlay。当绘图有进度时事件正在引发,我只想为每个子层的progressPercentage 分配一个数字。问题是当我因为这个事件重新创建子层时,GC 无法从内存中删除旧的子层。
标签: c# events event-handling