Утилизация пользовательских элементов управления WPF

Я создал пользовательский элемент управления WPF, предназначенный для использования третьей стороной. У моего элемента управления есть закрытый член, который является одноразовым, и я бы хотел, чтобы его метод dispose всегда вызывался после закрытия содержащего окна /приложения. Тем не менее, UserControl не является одноразовым. Я попытался реализовать интерфейс IDisposable и подписаться на событие Unloaded, но ни один из них не вызывался при закрытии приложения хоста. Если это вообще возможно, я не хочу полагаться на то, что потребители моего контроля помнят, чтобы вызывать определенный метод Dispose.

 public partial class MyWpfControl : UserControl
 {
     SomeDisposableObject x;

     // where does this code go?
     void Somewhere() 
     {
         if (x != null)
         {
             x.Dispose();
             x = null;
         }

     }
 }

Единственное решение, которое я нашел до сих пор, - это подписаться на событие Dispatcher ShutdownStarted. Это разумный подход?

this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
108 голосов | спросил Mark Heath 2 FebruaryEurope/MoscowbMon, 02 Feb 2009 13:20:20 +0300000000pmMon, 02 Feb 2009 13:20:20 +030009 2009, 13:20:20

6 ответов


0

Интересное сообщение в блоге здесь:

http: //geekswithblogs.net/cskardon/archive/2008/06/23/dispose-of-a-wpf-usercontrol-ish.aspx

В нем упоминается подписка на Dispatcher_ShutDownStarted распоряжаться своими ресурсами.

ответил Ray Booysen 2 FebruaryEurope/MoscowbMon, 02 Feb 2009 13:24:33 +0300000000pmMon, 02 Feb 2009 13:24:33 +030009 2009, 13:24:33
0
Событие

Dispatcher.ShutdownStarted наступает только в конце приложения. Стоит назвать логику утилизации только тогда, когда контроль выходит из строя. В частности, это освобождает ресурсы, когда управление используется много раз во время выполнения приложения. Поэтому решение ioWint является предпочтительным. Вот код:

public MyWpfControl()
{
     InitializeComponent();
     Loaded += (s, e) => { // only at this point the control is ready
         Window.GetWindow(this) // get the parent window
               .Closing += (s1, e1) => Somewhere(); //disposing logic here
     };
}
ответил Ilia Barahovski 18 TueEurope/Moscow2012-12-18T13:57:54+04:00Europe/Moscow12bEurope/MoscowTue, 18 Dec 2012 13:57:54 +0400 2012, 13:57:54
0

Вы должны быть осторожны, используя деструктор. Это будет вызвано в потоке финализатора GC. В некоторых случаях ресурсы, которые освобождаются при освобождении, могут отличаться от тех, в которых они были созданы.

ответил Ade Miller 8 J000000Wednesday09 2009, 02:31:22
0

Мой сценарий немного отличается, но намерение такое же, я хотел бы знать, когда родительское окно, в котором размещается мой пользовательский элемент управления, закрывается /закрывается, так как представление (т.е. мой usercontrol) должно вызывать докладчиков oncloseView для выполнения некоторых функций и выполнения. убирать (мы реализуем шаблон MVP в приложении WPF PRISM).

Я только что понял, что в событии Loaded пользовательского элемента управления я могу подключить свой метод ParentWindowClosing к событию закрытия родительского окна. Таким образом, мой Usercontrol может знать, когда родительское окно закрывается, и действовать соответственно!

ответил ioWint 4 AM000000120000003331 2011, 00:34:33
0

Я думаю, что unload называется всем, кроме как в 4.7. Но если вы играете со старыми версиями .Net, попробуйте сделать это в вашем методе загрузки:

e.Handled = true;

Я не думаю, что старые версии будут выгружаться до тех пор, пока загрузка не будет обработана. Просто отправляю сообщения, потому что я вижу, что другие все еще задают этот вопрос, и не рассматривали это как решение. Я касаюсь .Net только несколько раз в год, и столкнулся с этим несколько лет назад. Но мне интересно, не так ли просто вызвать unload, пока загрузка не закончится. Похоже, это работает для меня, но, опять же, в новых .Net он всегда вызывает unload, даже если загрузка не помечена как обработанная.

ответил Michael 31 Maypm18 2018, 23:04:02
0

UserControl имеет деструктор, почему бы вам не использовать его?

~MyWpfControl()
    {
        // Dispose of any Disposable items here
    }
ответил 2 FebruaryEurope/MoscowbMon, 02 Feb 2009 15:58:38 +0300000000pmMon, 02 Feb 2009 15:58:38 +030009 2009, 15:58:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132