Привет, я открываю такую форму из своей основной формы, когда пользователь выбирает пункт меню.
private void commToolStripMenuItem_Click(object sender, EventArgs e)
{
Command_Form Command_Form1 = new Command_Form();
Command_Form1.ShowDialog();
// Command_Form1.Dispose(); this didn't help
}
Внутри формы «Command_Form1» я закрываю ее вот так, когда пользователь нажимает кнопку закрытия
private void Close_button_Click(object sender, EventArgs e)
{
this.Close(); //I get the exception here
}
Этот процесс отлично работает один раз, но при втором закрытии формы (надеюсь, это совершенно другой/новый экземпляр формы) я получаю сообщение об ошибке в заголовке этого сообщения. Это вывод в окне отладки.
Первое исключение типа System.InvalidOperationException в System.Windows.Forms.dll
Во всех темах, в которых указана эта ошибка, говорится о том, что я не пытаюсь ничего сделать с формой, которая не отображается, но это происходит, когда я нажимаю кнопку в форме. Мне кажется, что в значительной степени гарантирует, что форма была отображена, если я могу щелкнуть ее кнопку.
Другие сообщения, которые я нашел, в которых перечислены ошибки этого типа, касаются выполнения потокобезопасных вызовов, поэтому я попробовал это в качестве эксперимента, но это не имело никакого значения.
private void Close_button_Click(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
CloseCallback d = new CloseCallback(Close_button_Click);
Invoke(d, new object[] { sender, e });
}
else
{
this.Close();
У меня есть несколько потоков в моем приложении, но они создаются элементами управления, которые я использую, а не мной явно. Я передаю данные из последовательного порта в/из формы путем маршалинга полученных/отправленных данных через делегата[ов]. Имеет смысл, что последовательный порт будет работать в потоке, отличном от формы, но почему нажатие кнопки на форме должно быть в потоке, отличном от формы????
Весь этот поток очень сбивает с толку. Как мне выяснить, какие потоки возникли, где и что происходит в потоках, которые я не создавал явно? Зачем мне вызывать метод закрытия формы через делегат? Черт возьми, есть ли что-нибудь, что я могу сделать в этой многопоточной среде, которая является потокобезопасной. Как я узнаю, что то, что я делаю, небезопасно/безопасно, если я не знаю, что/где/почему/кто/когда создает потоки?