Я столкнулся со странной проблемой при отображении всплывающей формы, которая вызывает InvalidAsynchronousStateException .
Прежде всего, вот код для Main {} где я запускаю всплывающую форму:
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Thread splash = new Thread(new ThreadStart(ShowSplash));
splash.Start();
Application.Run(new MainForm());
}
static void ShowSplash()
{
using (SplashForm splash = new SplashForm())
{
Application.Run(splash);
}
}
Я использую .NET2.0 с Win XP.
Во время некоторых испытаний, когда приложение оставалось работающим в течение нескольких часов, я заметилчто число исключений иногда увеличивается на один или два.(Числа, полученные PerfMon, просматривая счетчик «# of Exceps Thrown».) Эти исключения, похоже, улавливаются и проглатываются средой выполнения, потому что они не пульсируют и не приводят к ошибкам в самом приложении.По крайней мере, я ничего не могу определить.
Я обнаружил, что исключение выдается, когда система запускает событие UserPreferenceChanged.Обнаружив это, я могу сгенерировать исключение по желанию, изменив фоновое изображение или заставку и т. Д.
Я не подписываюсь на это событие самостоятельно нигде в коде, но я понимаю (благодаря силеGoogle), что все элементы управления и формы верхнего уровня подписываются на это событие автоматически.
Я до сих пор не определил, почему это событие запускается, во-первых, как это происходит, когда приложение работает ночью,но я предполагаю, что это еще одна загадка, которую нужно разгадать.
Теперь, если я остановлю запуск потока формы-всплеска, исключение исчезнет.Запустите поток, он возвращается.Итак, похоже, что что-то не отменяет подписку на событие, и, возможно, это вызывает последующее исключение?
Интересно, что если я заменил свою всплывающую форму на стандартную, из коробки «Форма», проблема все равно останется:
static void ShowSplash()
{
using (Form splash = new Form())
{
Application.Run(splash);
}
}
Во время отображения этой формы любые события UserPreferenceChanged не вызывают никаких исключений.Как только форма закрывается и поток завершается, генерируются исключения.
Дальнейшие исследования привели меня к этой статье Microsoft , в которой содержится следующий комментарий:
Распространенными причинами являются заставки, созданные во вторичном потоке пользовательского интерфейса, или любые элементы управления, созданные в рабочих потоках.
Хмм, виновные, как видно из их внешнего вида.Обратите внимание, что мое приложение не зависает и не делает ничего плохого.
В данный момент это больше любопытство, чем что-либо еще, но я убежден, что здесь могут быть какие-то скрытые гадости, ожидающие укуса вбудущее.
Для меня это выглядит как форма или насос сообщений, запущенный Application.Run не очищает должным образом, когда он завершается.
Есть мысли?