Серьезная проблема?Наверное, нет, но я не думаю, что проблема должна быть серьезной, чтобы ее нужно было исправить.Например, предупреждения должны рассматриваться как ошибки при компиляции.Кроме того, если это приложение отправлено клиентам, показывать уродливые ошибки при завершении работы не очень профессионально.
Как решить эту проблему, зависит от того, как вы настраиваете потоки («поток событий» не дает достаточноинформация о механике).Одним из простых способов может быть задержка основного потока на некоторое время, когда приложение завершает работу, пока не вернутся все потоки.Вы также должны прекратить выпуск новых потоков в течение этого времени.
Другое возможное решение состоит в том, чтобы управлять созданием потоков, чтобы можно было завершить процесс, который их запускает.Такие понятия, как ThreadPool приходят на ум.Кроме того, обеспечение того, что потоки являются фоновыми потоками, явно может помочь в некоторых ситуациях.
Краткий ответ: никто не сможет дать вам твердый ответ "это исправит вашу проблему" без некоторого контекста того, что вы делаетев вашем коде.
ДОБАВЛЕНО:
Есть несколько «быстрых, плохих и грязных» способов справиться с этим.У меня нет времени на полный анализ, поэтому посмотрите, работают ли они.
- Просто исправьте ошибку, подождав
- Добавьте счетчик и дождитесь увеличения до
Первое, что я хотел бы рассмотреть, - это добавить сеть безопасности, чтобы не обновлять метку в состоянии отключения.Это независимо от чего-либо еще, поскольку именно здесь ваши ошибки запускаются.Я не думаю, что «основной поток отсутствует» является ядром проблемы, а скорее эта строка:
Form1obj.updateLabel(String.Format("{0}", DateTime.Now.Second),Label1);
Как вы можете обновить то, что больше не существует?Да, это в главном потоке, так что технически ...
Простое ожидание будет выглядеть примерно так:
private void Form1_FormClosing(object sender,FormClosingEventArgs e)
{
aTimer.Enabled = false;
Thread.Sleep(5000);
}
Скрытие формы тоже неплохая идея, поэтому пользовательне видит этого?
Если вы хотите использовать более "COM-подобный подход", вы можете добавить счетчик.Инкремент на Update () (при возникновении события) и декремент OnTimedEvent ().Убедитесь, что вы заблокировали счетчик при его изменении, чтобы не было двух потоков, изменяющих его в одну и ту же миллисекунду.Затем вы можете подождать, пока счетчик не станет равным 0, чтобы завершить закрытие формы или выгрузку приложения.
Еще раз, это быстрые, сбитые и грязные подходы, но они могут уберечь вас от ошибки.Я уверен, что кто-то, у кого больше времени, может найти более элегантное решение.