Вот код:
Код: Выделить всё
public partial class App : Application
{
[STAThread]
public static void Main()
{
var app = new App();
app.InitializeComponent();
new DialogWindow().ShowDialog();
app.Run( new MainWindow() );
}
}
Но после его закрытия приложение немедленно закрывается. MainWindow вообще не отображается!
Я провел некоторую отладку и выявил проблему следующим образом:
- Когда диалоговое окно создано, оно становится MainWindow приложения, поскольку в данный момент MainWindow нет.
- Поэтому закрытие диалогового окна приводит к публикации приложения ShutdownCallback в очереди диспетчера.
- Однако диспетчер не работает достаточно долго, чтобы выполнить обратный вызов.
- Поэтому, как только app.Run вызывается впоследствии, первым объектом в очереди становится ShutdownCallback, что, естественно, приводит к немедленному закрытию приложения.
Однако вот что меня беспокоит.
Во-первых, мне это кажется грязным хаком. Я имею в виду, что нет явной причины для создания окон в таком порядке, и я нашел это только в результате некоторой отладки. Это не может быть поддерживаемым способом.
Во-вторых, это явная ошибка. Я имею в виду, что если бы создание второго окна после завершения работы не поддерживалось явно, оно должно было бы вызвать какое-то InvalidOperationException, верно?
В-третьих, это не только ошибка, но и выглядит очень наивно, что-то вроде того, что мог бы создать новичок в многопоточности.
Все это заставляет меня думать, что, возможно, я не понимаю здесь чего-то фундаментального? Может я вообще ничего не понимаю? Может быть, все это следует сделать каким-то другим способом?
Вот некоторая предыстория:
Приложению необходимо выполнить некоторую загрузку при запуске. Проверяйте то и это, настраивайте обработчики исключений, логируйте — знаете, обычные вещи. В этом процессе может возникнуть необходимость обратиться к пользователю за помощью — для этого и предназначен диалог.
Мне абсолютно не хочется помещать все это в какой-то конечный автомат, который выполняется на MainWindow.IsVisibleChanged или что-то в этом роде. Мне бы хотелось, чтобы он был по-настоящему простым, коротким и понятным — таким, каким должен быть код начальной загрузки, чтобы можно было легко обнаружить ошибки невооруженным глазом.
Подробнее здесь: https://stackoverflow.com/questions/370 ... re-startup
Мобильная версия