C# 如何正确使用代理?(以WPF故事板为例)

C# 如何正确使用代理?(以WPF故事板为例),c#,silverlight,windows-phone-7,delegates,C#,Silverlight,Windows Phone 7,Delegates,我的WindowsPhone7Silverlight应用程序中有以下代码,在导航到另一个页面之前执行 Storyboard storyboard = Resources["TurnstileBackwardOut"] as Storyboard; Storyboard.SetTarget(storyboard, LayoutRoot); storyboard.Completed += delegate { storyboard.Stop(); Debug.

我的WindowsPhone7Silverlight应用程序中有以下代码,在导航到另一个页面之前执行

Storyboard storyboard = Resources["TurnstileBackwardOut"] as Storyboard;
Storyboard.SetTarget(storyboard, LayoutRoot);
storyboard.Completed += delegate
    {
        storyboard.Stop();
        Debug.WriteLine("LeavePageStoryboard.Completed");
        NavigationService.Navigate(uri);
    };
storyboard.Begin();
故事板在资源中,并且经常被重用。据我所知,无论何时执行代码,都会向已完成的事件添加一个新的委托。我的问题是:我是否必须从已完成的事件中删除该代理


否则一段时间后,会有很多代表,其中一些甚至不属于当前页面,因为我在其他页面上也使用了故事板。

您应该能够判断这是否是一个问题,因为当您导航时,您会看到很多“LeavePageStoryboard.Completed”的副本。但是,除非每次都创建一个新的故事板,否则我怀疑这是一个问题。不过,修复起来很容易:

EventHandler completedHandler = null; // For definite assignment purposes
completedHandler = delegate
{
    storyboard.Stop();
    Debug.WriteLine("LeavePageStoryboard.Completed");
    NavigationService.Navigate(uri);
    storyboard.Completed -= completedHandler;
};
storyboard.Completed += completedHandler;

您应该能够判断这是否是一个问题,因为当您导航时,您将看到许多“LeavePageStoryboard.Completed”的副本。但是,除非每次都创建一个新的故事板,否则我怀疑这是一个问题。不过,修复起来很容易:

EventHandler completedHandler = null; // For definite assignment purposes
completedHandler = delegate
{
    storyboard.Stop();
    Debug.WriteLine("LeavePageStoryboard.Completed");
    NavigationService.Navigate(uri);
    storyboard.Completed -= completedHandler;
};
storyboard.Completed += completedHandler;

这是一个内存泄漏,在C#中很常见。如果您有一个经常被重用的长寿命对象,那么事件处理程序在其上堆积是很常见的

有两种选择:

1) 使您的代表不匿名。创建一个方法来保存其逻辑和引用的委托。然后,在完成序列图像板时删除此引用的委托


2) 让故事板不会长久存在。一种可能是将其改为DataTemplate,并实例化其新副本。然后,您可以将事件处理程序附加到它,一旦垃圾被收集,它们也会被收集

这是一个内存泄漏,在C#中很常见。如果您有一个经常被重用的长寿命对象,那么事件处理程序在其上堆积是很常见的

有两种选择:

1) 使您的代表不匿名。创建一个方法来保存其逻辑和引用的委托。然后,在完成序列图像板时删除此引用的委托

2) 让故事板不会长久存在。一种可能是将其改为DataTemplate,并实例化其新副本。然后,您可以将事件处理程序附加到它,一旦垃圾被收集,它们也会被收集