Неверная интерпретация c# weakreference при использовании его для форм?
Уважаемые эксперты
Похоже, я не понимаю, в чем дело.
WeakReference
Моя цель состоит в том, чтобы позволить "наблюдать" время жизни формы с помощью WeakReference.В моей основной форме я создаю Формтест, используя слабую ссылку:
public partial class FormMain : Form { private WeakReference weakRefFormTest= null; private void buttonNewForm_Click(object sender, EventArgs e) { if (weakRefFormTest == null) { // Create WeakReference and the form weakRefFormTest = new WeakReference(new FormTest()); ((Form)weakRefFormTest.Target).Show(); } else { // Check form alive *1) Form formTest = (Form)weakRefFormTest.Target; if (formTest != null) { formTest.Visible = !formTest.Visible; } } } ... ...... }
* 1) здесь я ожидаю, что
(Form)weakRefFormTest.Target
будет иметь значение null после закрытия тестовой формы. Но это не так, это даст мне всегда "действительную" форму. Также weakRefFormTest.IsAlive
возвращает true после закрытия formTest. И используя затем форму в коде выбрасывает System.ObjectDisposedException
Можете ли вы указать мне на то, чего я не понимаю, где я ошибаюсь?
Н.б.: я знаю, что мог бы подписаться на Form. Closed-Event, но мне не нравится такой подход.
Заранее большое вам спасибо.
Что я уже пробовал:
См. фрагмент кода в вопросе.
Hermann Jung
Слабая связь.Target будет равен null, когда GarbageCollector соберет форму. Form. Close () не вызывает GC.Collect () - и вы не должны делать это в своем коде (см. документацию GarbageCollector). Вероятно,вам следует провести еще одну проверку формы.IsDisposed.
0x01AA
Спасибо за ваш комментарий. Кажется, мне нужно погрузить деппера во все это.
0x01AA
Да конечно вы правы, if ((formTest != null) && !formtest.IsDisposed))
это приемлемый способ. Я думал о чем-то подобном, но только искал недвижимость Disposed
Я предлагаю опубликовать его как решение :-)