C# 如何正确使用代理?(以WPF故事板为例)
我的WindowsPhone7Silverlight应用程序中有以下代码,在导航到另一个页面之前执行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.
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,并实例化其新副本。然后,您可以将事件处理程序附加到它,一旦垃圾被收集,它们也会被收集