Программа, которую я пишу, включает консоль. Я создал UserControl
под названием Console. Этот класс консоли имеет несколько фоновых рабочих процессов, выполняющих различные задачи. Проблема, с которой я столкнулся, заключается в том, что если я помещаю этот элемент управления в форму, а затем закрываю ее, я иногда сталкиваюсь с проблемами, когда потоки BackgroundWorker
вызывают вызовы удаленных объектов.
На основе этого потока мне нужно остановить закрытие формы и сам обработаю запрос на закрытие. У меня большая часть этого написана успешно, но основная проблема, с которой я сталкиваюсь, заключается в подписке на событие FormClosing
ParentForm
.
Я пытался использовать this.ParentForm
, но не могу найти подходящего места, где это не равно нулю.
Конечно, я не могу сделать это в конструкторе, так как он генерируется в данный момент.
Я также не могу использовать это в событии ParentChanged
, как указано в этой теме. Когда это срабатывает, this.Parent
больше не равно нулю, но это не this.ParentForm
. Я понимаю, что иногда это может быть, но, например, в настоящее время я сижу в элементе управления вкладками, так что это не совсем то, что я хочу.
Тогда у нас также есть это предложение, чтобы попытаться подключиться к функции this.Load
(я ссылаюсь на второй ответ, а не на выбранный), но опять же, this.ParentForm
здесь равно нулю. Как и раньше, this.Parent
имеет значение, но это не совсем то, что мне нужно.
Наконец, я подумал, что нашел решение своей проблемы, когда наткнулся на этот поток предлагает переопределить OnCreateControl
, но опять же... не повезло, оба пусты.
После того, как форма загружена, я добавил кнопку, которую я могу нажать, и в этот момент я смог определить, что this.ParentForm
действительно заполняется правильно.
Мой вопрос: где я могу получить this.ParentForm
UserControl
, где он не равен нулю, чтобы я мог подписаться на его события?
Изменить: добавление части моего кода по запросу LarsTech:
Результат этого кода:
This.Parent имеет значение
This.ParentForm имеет значение null
private MyConsole(string COMPort)
{
// I do this so that the console window is created by the time I have started my Background Workers
this.CreateHandle();
// Generate the form
InitializeComponent();
// set the COM Port Name
_COMPort = COMPort;
ReadOnly = true;
ActiveCloseRequest = false;
// This just creates 1 or 2 background workers
StartBackgroundWorkers();
this.ParentChanged += MyConsole_ParentChanged;
}
void MyConsole_ParentChanged(object sender, EventArgs e)
{
if (this.Parent == null)
{
Console.WriteLine("This.Parent is null");
}
else
{
Console.WriteLine("This.Parent has a value");
}
if (this.ParentForm == null)
{
Console.WriteLine("This.ParentForm is null");
}
else
{
Console.WriteLine("This.ParentForm has a value");
}
}