Как правильно работать с IDisposable UserControl на странице XAMLC#

Место общения программистов C#
Ответить
Anonymous
 Как правильно работать с IDisposable UserControl на странице XAML

Сообщение Anonymous »

У меня есть пользовательский элемент управления, который я не писал. В XAML элемента управления есть объект с неуправляемыми ресурсами. Он создает цели рендеринга Direct3D, трафаретные поверхности глубины и т.п., а также хранит ресурсы DirectX и OpenGL, полученные посредством взаимодействия. Я считаю, что они взяты из пакета OpenTK NuGet. Поэтому автор элемента управления реализовал IDisposable.
Но поскольку элемент управления находится на странице XAML, и мы не контролируем его время жизни, автор не получает возможности вызвать Dispose с чем-либо вроде оператора using. Поэтому автор решил вызвать Dispose в его обработчике Unloaded.
Но это источник моей проблемы. Представление, в котором находится этот элемент управления, может загружаться и выгружаться несколько раз. Я не контролирую его срок службы, это делает WPF, и WPF любит использовать его повторно. Таким образом, вызывается обработчик Unloaded, вызывается Dispose, который освобождает неуправляемые ресурсы, а затем тот же экземпляр загружается снова.
Из чтения Следует ли сделать IDisposable.Dispose() безопасным для многократного вызова? и во многих других темах, я всегда понимал следующее о реализации IDisposable:
  • Вы всегда должны пытаться вызвать его самостоятельно
  • Вы не должны иметь привычку вызывать его более одного раза
Итак, каков правильный способ справиться с этим? Должен ли я игнорировать элемент №2 и попытаться создать какую-то функцию Initialize для сопряжения с Dispose, которая позволит их безопасно вызывать снова и снова?
Или мне следует добавить финализатор к этому элементу управления, который вызывает Dispose за меня? Я не уверен, что это сработает, поскольку освобождаемые неуправляемые ресурсы необходимо (я думаю) освобождать в том же потоке пользовательского интерфейса, который их выделил.
Есть ли другой правильный подход?
Вот немного XAML элемента управления:






Подробнее здесь: https://stackoverflow.com/questions/798 ... -xaml-page
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»